{
  "lastUpdated": "2026-09-28T05:02:54.323Z",
  "events": [
    {
      "hash": "6d16fd09a49643511ca0b85e6e53d8d5c096db5b",
      "shortHash": "6d16fd0",
      "date": "2026-09-26T13:33:15.000Z",
      "category": "feature",
      "title": "/build-info.json — what this deploy was built from",
      "rawSubject": "feat: /build-info.json — what this deploy was built from",
      "url": "/"
    },
    {
      "hash": "fe42c9b9ab900e0cf4965190d908d848a08b9e28",
      "shortHash": "fe42c9b",
      "date": "2026-09-24T08:40:05.000Z",
      "category": "newsletter",
      "title": "2026-09-24 [skip netlify]",
      "rawSubject": "chore: newsletter sent 2026-09-24 [skip netlify]",
      "url": "/briefings"
    },
    {
      "hash": "dae595060b4cd71b681cc74a2369926c42f8cf91",
      "shortHash": "dae5950",
      "date": "2026-09-24T08:39:29.000Z",
      "category": "newsletter",
      "title": "24 September 2026 weekly briefing — Europe's biggest diesel supplier is now a political variable",
      "rawSubject": "newsletter: 24 September 2026 weekly briefing — Europe's biggest diesel supplier is now a political variable",
      "url": "/briefings"
    },
    {
      "hash": "925131d822733b81175ba004b142907f71ed02bd",
      "shortHash": "925131d",
      "date": "2026-09-18T09:01:50.000Z",
      "category": "feature",
      "title": "Stage 7 — three labelled clocks, approval kept distinct, origin/withheld notices, sources, data-analysis-* attributes",
      "rawSubject": "feat(presentation): stage 7 — three labelled clocks, approval kept distinct, origin/withheld notices, sources, data-analysis-* attributes",
      "url": "/"
    },
    {
      "hash": "5a09321e1502c7ca09da0eb5798991ab971825e6",
      "shortHash": "5a09321",
      "date": "2026-09-18T08:04:17.000Z",
      "category": "feature",
      "title": "Stage 6 — the first live-capable Euro structured seed, dormant, with its campaign evidence",
      "rawSubject": "feat(analysis): stage 6 — the first live-capable Euro structured seed, dormant, with its campaign evidence",
      "url": "/"
    },
    {
      "hash": "ede09f4c75b2ddd647d9883a80dba8b72310937a",
      "shortHash": "ede09f4",
      "date": "2026-09-17T12:58:41.000Z",
      "category": "feature",
      "title": "Stage 6 prepared offline — Euro structured generator, campaign driver, gateway dollar cap",
      "rawSubject": "feat(analysis): stage 6 prepared offline — Euro structured generator, campaign driver, gateway dollar cap",
      "url": "/"
    },
    {
      "hash": "d562713d3dd227d5a2606298079bb72848c0f16c",
      "shortHash": "d562713",
      "date": "2026-09-17T12:26:30.000Z",
      "category": "feature",
      "title": "Stage 5 — the Euro store publisher, isolated to euro/, all-or-nothing",
      "rawSubject": "feat(store): stage 5 — the Euro store publisher, isolated to euro/, all-or-nothing",
      "url": "/"
    },
    {
      "hash": "c8e6c04ed621c7c2334157f3f9126f4bbc9e94be",
      "shortHash": "c8e6c04",
      "date": "2026-09-17T12:07:21.000Z",
      "category": "feature",
      "title": "Stage 4 — one effective-analysis resolution for pages, newsletter and verifier",
      "rawSubject": "feat(analysis): stage 4 — one effective-analysis resolution for pages, newsletter and verifier",
      "url": "/"
    },
    {
      "hash": "72451014761aa500c2fa20be7b434cf9cde06fa6",
      "shortHash": "7245101",
      "date": "2026-09-17T11:35:19.000Z",
      "category": "feature",
      "title": "Stage 3 — the Euro fact catalogue, sources and display rules",
      "rawSubject": "feat(analysis): stage 3 — the Euro fact catalogue, sources and display rules",
      "url": "/"
    },
    {
      "hash": "920dd937ab9cc66b51a0155f856f35fe0202789d",
      "shortHash": "920dd93",
      "date": "2026-09-17T11:09:06.000Z",
      "category": "feature",
      "title": "Stage 2 — typed proportion population, checklist evidence, UK assessment",
      "rawSubject": "feat(analysis): stage 2 — typed proportion population, checklist evidence, UK assessment",
      "url": "/"
    },
    {
      "hash": "7b07e915272459559d22b2dcfd05e64abf7a151f",
      "shortHash": "7b07e91",
      "date": "2026-09-17T09:59:05.000Z",
      "category": "feature",
      "title": "Stage 2 — the structured core, with guards that fail closed",
      "rawSubject": "feat(analysis): stage 2 — the structured core, with guards that fail closed",
      "url": "/"
    },
    {
      "hash": "b552802095bef02f4a0a636076432e3c477283db",
      "shortHash": "b552802",
      "date": "2026-09-17T08:58:13.000Z",
      "category": "newsletter",
      "title": "2026-09-17 [skip netlify]",
      "rawSubject": "chore: newsletter sent 2026-09-17 [skip netlify]",
      "url": "/briefings"
    },
    {
      "hash": "8098f60f9cf9685d69fc3b2d77bc873012a82dec",
      "shortHash": "8098f60",
      "date": "2026-09-17T08:57:40.000Z",
      "category": "newsletter",
      "title": "17 September 2026 weekly briefing — Europe's replacement fuel faces three new pressures",
      "rawSubject": "newsletter: 17 September 2026 weekly briefing — Europe's replacement fuel faces three new pressures",
      "url": "/briefings"
    },
    {
      "hash": "7b1cfab982b741826654e06b761cb098c3a70866",
      "shortHash": "7b1cfab",
      "date": "2026-09-16T14:01:12.000Z",
      "category": "feature",
      "title": "A null EU mean is presented as not assessable; every \"X of Y\" names its population",
      "rawSubject": "feat(reserves): a null EU mean is presented as not assessable; every \"X of Y\" names its population",
      "url": "/"
    },
    {
      "hash": "a6234a2a5d4a82b262785b8c94c1fa66cb02a1e7",
      "shortHash": "a6234a2",
      "date": "2026-09-14T15:25:53.000Z",
      "category": "feature",
      "title": "Zero-handling policy — a reported zero withholds cover by policy, a zero denominator by arithmetic, nothing older is ever the current figure",
      "rawSubject": "feat(reserves): zero-handling policy — a reported zero withholds cover by policy, a zero denominator by arithmetic, nothing older is ever the current figure",
      "url": "/"
    },
    {
      "hash": "52433e6be8aa1faac67335eb3fadb4240938f027",
      "shortHash": "52433e6",
      "date": "2026-09-14T10:49:08.000Z",
      "category": "feature",
      "title": "Every reserve figure records its provenance; the EU average says it is an unweighted mean",
      "rawSubject": "feat(reserves): every reserve figure records its provenance; the EU average says it is an unweighted mean",
      "url": "/"
    },
    {
      "hash": "a095f008d27112f5d1ab351564bc5c45db2d91fc",
      "shortHash": "a095f00",
      "date": "2026-09-11T15:40:27.000Z",
      "category": "feature",
      "title": "Gate every Anthropic call behind an audited, budgeted gateway",
      "rawSubject": "feat: gate every Anthropic call behind an audited, budgeted gateway",
      "url": "/"
    },
    {
      "hash": "bdbdfa6f3fe8ea2ca0ae18f268ff1993a2e76816",
      "shortHash": "bdbdfa6",
      "date": "2026-09-10T12:19:44.000Z",
      "category": "newsletter",
      "title": "2026-09-10 [skip netlify]",
      "rawSubject": "chore: newsletter sent 2026-09-10 [skip netlify]",
      "url": "/briefings"
    },
    {
      "hash": "4de7b790c289851ceb4d58dc7cf85a66618c3c4b",
      "shortHash": "4de7b79",
      "date": "2026-09-03T15:54:26.000Z",
      "category": "analysis",
      "title": "El Nino 2026 — WMO warning and observed transmission",
      "rawSubject": "analysis: El Nino 2026 — WMO warning and observed transmission",
      "url": "/analysis"
    },
    {
      "hash": "5146c455658737e6bcf79f80ecfe03c953371720",
      "shortHash": "5146c45",
      "date": "2026-09-03T08:55:46.000Z",
      "category": "newsletter",
      "title": "2026-09-03 [skip netlify]",
      "rawSubject": "chore: newsletter sent 2026-09-03 [skip netlify]",
      "url": "/briefings"
    },
    {
      "hash": "6e9f743560872455488c3d850aaee81fe1f9bea6",
      "shortHash": "6e9f743",
      "date": "2026-09-03T08:55:15.000Z",
      "category": "newsletter",
      "title": "Europe's maintenance test has begun (3 Sep)",
      "rawSubject": "newsletter: Europe's maintenance test has begun (3 Sep)",
      "url": "/briefings"
    },
    {
      "hash": "ee6cccea4dbe38086a6be127f26abeb9a4a30d64",
      "shortHash": "ee6ccce",
      "date": "2026-09-02T13:48:15.000Z",
      "category": "newsletter",
      "title": "A send may only originate from main, and prove the render",
      "rawSubject": "Newsletter: a send may only originate from main, and prove the render",
      "url": "/briefings"
    },
    {
      "hash": "025f24eb7a83de66ad7636c7bfbc9c25ea1eab6b",
      "shortHash": "025f24e",
      "date": "2026-09-02T13:30:25.000Z",
      "category": "newsletter",
      "title": "Name the launched product, link it, and attribute the click",
      "rawSubject": "Newsletter: name the launched product, link it, and attribute the click",
      "url": "/briefings"
    },
    {
      "hash": "15455228c43b8d6da3feee67a500a695a1e2cc11",
      "shortHash": "1545522",
      "date": "2026-08-27T11:01:38.000Z",
      "category": "newsletter",
      "title": "2026-08-27 [skip netlify]",
      "rawSubject": "chore: newsletter sent 2026-08-27 [skip netlify]",
      "url": "/briefings"
    },
    {
      "hash": "f6685b92c2abcf5578589f8a458f2044e1c27699",
      "shortHash": "f6685b9",
      "date": "2026-08-27T11:01:08.000Z",
      "category": "newsletter",
      "title": "Crude Fell. Europe's Energy Costs Didn't. (27 Aug)",
      "rawSubject": "newsletter: Crude Fell. Europe's Energy Costs Didn't. (27 Aug)",
      "url": "/briefings"
    },
    {
      "hash": "e38597c23191e7e6918c0e8d1919edddc8126754",
      "shortHash": "e38597c",
      "date": "2026-08-20T09:51:06.000Z",
      "category": "newsletter",
      "title": "2026-08-20 [skip netlify]",
      "rawSubject": "chore: newsletter sent 2026-08-20 [skip netlify]",
      "url": "/briefings"
    },
    {
      "hash": "d193b43003c73d30b3e1fb4335d46df08f0c0d6f",
      "shortHash": "d193b43",
      "date": "2026-08-17T08:49:55.000Z",
      "category": "analysis",
      "title": "The Oil Trade Has Gone Dark + 17 August board update",
      "rawSubject": "Analysis: The Oil Trade Has Gone Dark + 17 August board update",
      "url": "/analysis"
    },
    {
      "hash": "e3ad5e9c5197266b4bbf1ca3d3e96f97455acffd",
      "shortHash": "e3ad5e9",
      "date": "2026-08-13T13:42:15.000Z",
      "category": "analysis",
      "title": "One River, Two Outcomes — Paks restarts while Cernavodă shuts down",
      "rawSubject": "Analysis: One River, Two Outcomes — Paks restarts while Cernavodă shuts down",
      "url": "/analysis"
    },
    {
      "hash": "a84bd260f8c9ceedf4bd3e8f49358adf4504cd50",
      "shortHash": "a84bd26",
      "date": "2026-08-13T08:57:05.000Z",
      "category": "newsletter",
      "title": "Standing Observatory end-block, generated from config",
      "rawSubject": "Newsletter: standing Observatory end-block, generated from config",
      "url": "/briefings"
    },
    {
      "hash": "0bceb158a94ca02d020a12a11c419fc6f6ebe27d",
      "shortHash": "0bceb15",
      "date": "2026-08-13T08:33:54.000Z",
      "category": "newsletter",
      "title": "2026-08-13",
      "rawSubject": "chore: newsletter sent 2026-08-13",
      "url": "/briefings"
    },
    {
      "hash": "1f193bc2e6529440c0d1e9aa73a22153221e3a5e",
      "shortHash": "1f193bc",
      "date": "2026-08-13T08:20:23.000Z",
      "category": "analysis",
      "title": "The Danube Forces Romania's Last Operating Nuclear Reactor Offline",
      "rawSubject": "Analysis: The Danube Forces Romania's Last Operating Nuclear Reactor Offline",
      "url": "/analysis"
    },
    {
      "hash": "0f74f241db7887ce48a5855dfa7b231ef8f329ae",
      "shortHash": "0f74f24",
      "date": "2026-08-06T08:43:21.000Z",
      "category": "newsletter",
      "title": "2026-08-06",
      "rawSubject": "chore: newsletter sent 2026-08-06",
      "url": "/briefings"
    },
    {
      "hash": "02e8490c0ef1199612a253f4a6e64ab502cc81cd",
      "shortHash": "02e8490",
      "date": "2026-07-30T09:31:08.000Z",
      "category": "newsletter",
      "title": "2026-07-30",
      "rawSubject": "chore: newsletter sent 2026-07-30",
      "url": "/briefings"
    },
    {
      "hash": "85a52e2d3b3056cd6966478498224720f60a178a",
      "shortHash": "85a52e2",
      "date": "2026-07-30T09:30:41.000Z",
      "category": "newsletter",
      "title": "Euro weekly 2026-07-30 — Europe has a fuel problem, not just an oil-price problem",
      "rawSubject": "newsletter: Euro weekly 2026-07-30 — Europe has a fuel problem, not just an oil-price problem",
      "url": "/briefings"
    },
    {
      "hash": "51b606b939b972ba117c2bc9d9ccde3348cc059f",
      "shortHash": "51b606b",
      "date": "2026-07-23T08:47:14.000Z",
      "category": "newsletter",
      "title": "2026-07-23",
      "rawSubject": "chore: newsletter sent 2026-07-23",
      "url": "/briefings"
    },
    {
      "hash": "86059b038b94e4a55554a743725fdaa4681e5457",
      "shortHash": "86059b0",
      "date": "2026-07-18T17:52:28.000Z",
      "category": "analysis",
      "title": "'Bypassing a Chokepoint 135 Barrels at a Time' (all 3) + framework banner",
      "rawSubject": "analysis: 'Bypassing a Chokepoint 135 Barrels at a Time' (all 3) + framework banner",
      "url": "/analysis"
    },
    {
      "hash": "0d8862ae5b949be553540543443275caeb3ed8e3",
      "shortHash": "0d8862a",
      "date": "2026-07-18T13:02:51.000Z",
      "category": "analysis",
      "title": "The financial frame — Pressure Cooker + Yen carry-trade pair (all 3 sites)",
      "rawSubject": "analysis: the financial frame — Pressure Cooker + Yen carry-trade pair (all 3 sites)",
      "url": "/analysis"
    },
    {
      "hash": "f234ebd8f57d3a738e2a15bb49c636a9339a9bdf",
      "shortHash": "f234ebd",
      "date": "2026-07-16T08:53:18.000Z",
      "category": "newsletter",
      "title": "2026-07-16",
      "rawSubject": "chore: newsletter sent 2026-07-16",
      "url": "/briefings"
    },
    {
      "hash": "eb29448078ed054a2a303c68c6aad0ec8d4fb914",
      "shortHash": "eb29448",
      "date": "2026-07-16T08:52:53.000Z",
      "category": "newsletter",
      "title": "EuroOilWatch Weekly — refined-fuel squeeze (week of 16 July)",
      "rawSubject": "newsletter: EuroOilWatch Weekly — refined-fuel squeeze (week of 16 July)",
      "url": "/briefings"
    },
    {
      "hash": "cdc7611a14b15c819749959bf9167b179b08fe3f",
      "shortHash": "cdc7611",
      "date": "2026-07-13T09:51:14.000Z",
      "category": "feature",
      "title": "Hormuz Force Posture Phase 2 — incidents strip from the timeline",
      "rawSubject": "feat: Hormuz Force Posture Phase 2 — incidents strip from the timeline",
      "url": "/"
    },
    {
      "hash": "fbec65c9fd90c5311633dd86f808352f40a60a18",
      "shortHash": "fbec65c",
      "date": "2026-07-13T09:33:57.000Z",
      "category": "feature",
      "title": "Hormuz Force Posture panel (Phase 1) — sourced US/Iran order of battle",
      "rawSubject": "feat: Hormuz Force Posture panel (Phase 1) — sourced US/Iran order of battle",
      "url": "/"
    },
    {
      "hash": "bafb40cad9d725e728da432b37a668a61fa132c0",
      "shortHash": "bafb40c",
      "date": "2026-07-13T08:49:02.000Z",
      "category": "feature",
      "title": "FreshnessGuard — wire the last two surfaces (supply note + DisruptionBanner)",
      "rawSubject": "feat: FreshnessGuard — wire the last two surfaces (supply note + DisruptionBanner)",
      "url": "/"
    },
    {
      "hash": "cd96ae311745b8052f0f6798c306eb4922074bcf",
      "shortHash": "cd96ae3",
      "date": "2026-07-13T08:43:05.000Z",
      "category": "feature",
      "title": "FreshnessGuard — editorial surfaces now self-flag when stale",
      "rawSubject": "feat: FreshnessGuard — editorial surfaces now self-flag when stale",
      "url": "/"
    },
    {
      "hash": "37f5c5b4a50db80cc91cedff25a46b41384ac2f2",
      "shortHash": "37f5c5b",
      "date": "2026-07-13T08:28:20.000Z",
      "category": "analysis",
      "title": "Publish 'Europe's Self-Inflicted Exposure' (EuroOilWatch, Part III)",
      "rawSubject": "analysis: publish 'Europe's Self-Inflicted Exposure' (EuroOilWatch, Part III)",
      "url": "/analysis"
    },
    {
      "hash": "1a90abd01c1bbb10a87c4feffe1412094335ec07",
      "shortHash": "1a90abd",
      "date": "2026-07-11T16:29:21.000Z",
      "category": "analysis",
      "title": "Publish Part II — 'Hormuz Is Not Reopened … a Second Diesel Shock Emerges'",
      "rawSubject": "analysis: publish Part II — 'Hormuz Is Not Reopened … a Second Diesel Shock Emerges'",
      "url": "/analysis"
    },
    {
      "hash": "4fd0ee862bea9c98af38ae35a1e6967b25146764",
      "shortHash": "4fd0ee8",
      "date": "2026-07-10T15:35:49.000Z",
      "category": "analysis",
      "title": "Publish 'The Second Shock Is Not the First' + dashboard banner",
      "rawSubject": "analysis: publish 'The Second Shock Is Not the First' + dashboard banner",
      "url": "/analysis"
    },
    {
      "hash": "cec043ef495ece79fa6705db2950a7e99fd2800c",
      "shortHash": "cec043e",
      "date": "2026-07-07T16:22:10.000Z",
      "category": "analysis",
      "title": "'Hormuz as a Toll Road' — the strikes are enforcement",
      "rawSubject": "analysis: 'Hormuz as a Toll Road' — the strikes are enforcement",
      "url": "/analysis"
    },
    {
      "hash": "3317c6d84c801a3ca60fea43164ae4d462bf0a81",
      "shortHash": "3317c6d",
      "date": "2026-07-06T12:12:00.000Z",
      "category": "analysis",
      "title": "'A Record Crack Spread Is Not a Record Profit' + crack-panel caveat",
      "rawSubject": "analysis: 'A Record Crack Spread Is Not a Record Profit' + crack-panel caveat",
      "url": "/analysis"
    },
    {
      "hash": "934991152c9d3bb4e5b58ead441505f1f538ae03",
      "shortHash": "9349911",
      "date": "2026-07-04T08:47:53.000Z",
      "category": "analysis",
      "title": "'A low oil price is not safety' (two-speed reopening) + refresh red banner to lead with it",
      "rawSubject": "analysis: 'A low oil price is not safety' (two-speed reopening) + refresh red banner to lead with it",
      "url": "/analysis"
    },
    {
      "hash": "e6b99d43c24f1aa83e373f2e87841b322d944aa5",
      "shortHash": "e6b99d4",
      "date": "2026-07-03T08:18:59.000Z",
      "category": "newsletter",
      "title": "2026-07-03",
      "rawSubject": "chore: newsletter sent 2026-07-03",
      "url": "/briefings"
    },
    {
      "hash": "dfb9848bd22742f1fcac1478c7528b4b8e89b3ca",
      "shortHash": "dfb9848",
      "date": "2026-07-02T09:37:45.000Z",
      "category": "newsletter",
      "title": "2026-07-02",
      "rawSubject": "chore: newsletter sent 2026-07-02",
      "url": "/briefings"
    },
    {
      "hash": "b2bff51505be4cf7dd5af64cb8eb96b140fbcfbe",
      "shortHash": "b2bff51",
      "date": "2026-07-02T09:37:23.000Z",
      "category": "newsletter",
      "title": "EuroOilWatch weekly briefing — 2 July 2026",
      "rawSubject": "newsletter: EuroOilWatch weekly briefing — 2 July 2026",
      "url": "/briefings"
    },
    {
      "hash": "10c892f1821762af05659ec89194354d23833275",
      "shortHash": "10c892f",
      "date": "2026-06-30T16:55:06.000Z",
      "category": "feature",
      "title": "EU crude import-origins Sankey on real Eurostat data",
      "rawSubject": "feat(supply): EU crude import-origins Sankey on real Eurostat data",
      "url": "/supply"
    }
  ],
  "siteBaseUrl": "https://eurooilwatch.com"
}