{
  "name": "Warconomy — forecast resolution readiness",
  "asOf": "2026-06-05",
  "note": "For each open forecast: the deciding source, its publication schedule, the scoring method, the naive baseline, and the exact dates at which the record becomes nearing-resolution, expired, and due for an unresolvable review. Also includes the dry-run suite, which proves the scoring workflow against fixture outcomes without touching production data. Dry-run outcomes are FIXTURES, never real observations.",
  "readiness": [
    {
      "forecastId": "fc-2026-07-18-eu-21st-package",
      "slug": "eu-21st-sanctions-package-adoption",
      "title": "EU adopts a 21st Russia sanctions package by 30 September 2026",
      "domain": "sanctions",
      "targetPeriod": "The Council of the EU formally adopts a package publicly designated as the 21st package of restrictive measures against Russia, on or before 30 September 2026",
      "expectedResolutionDate": "2026-09-30",
      "resolutionSource": "Council of the European Union official press releases and the EU Official Journal",
      "resolutionSourceIds": [
        "eu-council-sanctions",
        "ec-circumvention-20th"
      ],
      "sourcePublicationSchedule": "Irregular — tied to Council meetings and member-state agreement; no fixed cadence.",
      "targetDefinition": "Resolves TRUE if the Council of the EU publishes an adopted legal act (Official Journal publication or an official Council press release announcing adoption) for a package publicly designated the '21st package' against Russia, dated on or before 30 September 2026. A further 'mini' or rolling package that is NOT designated the 21st package does not resolve this TRUE. Resolves FALSE otherwise, including if the package is still under negotiation on that date.",
      "unit": "probability band",
      "scoringMethod": "binary",
      "naiveBaseline": "Historical base rate: assume the event does not occur.",
      "delayedPublicationFallback": "Stays nearing-resolution through the 30-day sanctions grace period, then enters the resolution-data-overdue queue. It is never scored against a substitute measure to beat a deadline.",
      "definitionChangeFallback": "If the published metric's definition no longer matches the target definition, the resolution engine refuses to score and the record is classified unresolvable with a public reason.",
      "nearingResolutionAt": "2026-08-31",
      "expiresAt": "2026-10-30",
      "unresolvableReviewAt": "2027-01-28",
      "readyToScore": true,
      "blockers": []
    },
    {
      "forecastId": "fc-2026-07-18-suez-transits-depressed",
      "slug": "suez-transit-volumes-remain-depressed",
      "title": "Suez transit volumes remain far below the pre-2024 baseline through 2026",
      "domain": "shipping",
      "targetPeriod": "Suez Canal monthly transits for December 2026 remain at least 25% below the comparable pre-disruption 2023 monthly baseline",
      "expectedResolutionDate": "2027-01-31",
      "resolutionSource": "Suez Canal Authority navigation statistics; IMF PortWatch as designated fallback",
      "resolutionSourceIds": [
        "suez-canal-authority",
        "sca-chairman-statement-2026",
        "imf-portwatch-chokepoints",
        "imf-portwatch-red-sea"
      ],
      "sourcePublicationSchedule": "Monthly navigation statistics, published with a lag; historically intermittently reachable. Regular transit series updates; the designated fallback for Suez.",
      "targetDefinition": "Resolves TRUE if the Suez Canal Authority's published December 2026 monthly transit count is at least 25% below its published December 2023 count. If SCA figures are unavailable at the resolution date, IMF PortWatch's Suez transit series is the designated fallback, and the same 25% test is applied to it. If neither publishes a comparable figure, the forecast resolves UNRESOLVABLE rather than being scored on a substitute measure.",
      "unit": "probability band",
      "scoringMethod": "threshold",
      "naiveBaseline": "Persistence: assume the indicator stays on its current side of the threshold.",
      "delayedPublicationFallback": "Stays nearing-resolution through the 45-day shipping grace period, then enters the resolution-data-overdue queue. It is never scored against a substitute measure to beat a deadline.",
      "definitionChangeFallback": "If the published metric's definition no longer matches the target definition, the resolution engine refuses to score and the record is classified unresolvable with a public reason.",
      "nearingResolutionAt": "2026-12-17",
      "expiresAt": "2027-03-17",
      "unresolvableReviewAt": "2027-07-30",
      "readyToScore": true,
      "blockers": []
    },
    {
      "forecastId": "fc-2026-07-18-eia-brent-revision",
      "slug": "eia-brent-forecast-revision-direction",
      "title": "EIA revises its 4Q2026 Brent forecast upward in the August 2026 STEO",
      "domain": "energy",
      "targetPeriod": "The August 2026 STEO's 4Q2026 Brent forecast is higher than the July 2026 STEO's figure of $70.00/b",
      "expectedResolutionDate": "2026-08-31",
      "resolutionSource": "EIA Short-Term Energy Outlook, August 2026 edition",
      "resolutionSourceIds": [
        "eia-steo"
      ],
      "sourcePublicationSchedule": "Monthly, typically in the first full week; the July 2026 edition published 7 July with a 1 July data cutoff.",
      "targetDefinition": "Resolves TRUE if the EIA's August 2026 Short-Term Energy Outlook publishes a 4Q2026 Brent spot price forecast strictly greater than $70.00/b (the July 2026 STEO value). Resolves FALSE if it is equal to or lower. If the EIA discontinues or restructures the 4Q2026 Brent line item, resolves UNRESOLVABLE.",
      "unit": "probability band",
      "scoringMethod": "revision",
      "naiveBaseline": "No-revision: assume the institution repeats its prior published figure.",
      "delayedPublicationFallback": "Stays nearing-resolution through the 14-day energy grace period, then enters the resolution-data-overdue queue. It is never scored against a substitute measure to beat a deadline.",
      "definitionChangeFallback": "If the published metric's definition no longer matches the target definition, the resolution engine refuses to score and the record is classified unresolvable with a public reason.",
      "nearingResolutionAt": "2026-08-10",
      "expiresAt": "2026-09-14",
      "unresolvableReviewAt": "2026-10-30",
      "readyToScore": true,
      "blockers": []
    },
    {
      "forecastId": "fc-2026-07-18-sudan-idp-threshold",
      "slug": "sudan-idp-count-next-dtm-round",
      "title": "Sudan IDP count stays above 8 million in IOM DTM's next published round",
      "domain": "humanitarian",
      "targetPeriod": "IOM DTM's next published Sudan displacement round reports a national IDP total above 8,000,000",
      "expectedResolutionDate": "2027-03-31",
      "resolutionSource": "IOM Displacement Tracking Matrix, Sudan displacement and return snapshots",
      "resolutionSourceIds": [
        "iom-dtm-sudan"
      ],
      "sourcePublicationSchedule": "Irregular survey rounds, roughly quarterly, published 2-4 months after fieldwork.",
      "targetDefinition": "Resolves TRUE if the first IOM DTM Sudan displacement/return snapshot published after 18 July 2026 reports a national IDP estimate strictly greater than 8,000,000. Resolves FALSE if it reports 8,000,000 or fewer. If DTM does not publish a national IDP total for Sudan before 31 March 2027, resolves UNRESOLVABLE.",
      "unit": "probability band",
      "scoringMethod": "threshold",
      "naiveBaseline": "Persistence: assume the indicator stays on its current side of the threshold.",
      "delayedPublicationFallback": "Stays nearing-resolution through the 90-day humanitarian grace period, then enters the resolution-data-overdue queue. It is never scored against a substitute measure to beat a deadline.",
      "definitionChangeFallback": "If the published metric's definition no longer matches the target definition, the resolution engine refuses to score and the record is classified unresolvable with a public reason.",
      "nearingResolutionAt": "2027-01-30",
      "expiresAt": "2027-06-29",
      "unresolvableReviewAt": "2027-12-26",
      "readyToScore": true,
      "blockers": []
    },
    {
      "forecastId": "fc-2026-07-18-ukraine-civilian-casualty-trend",
      "slug": "ukraine-civilian-casualty-monthly-trend",
      "title": "OHCHR reports at least one month in H2 2026 above the H1 2026 monthly average",
      "domain": "conflict",
      "targetPeriod": "At least one month between July and December 2026 records verified civilian casualties above the January-June 2026 monthly average of roughly 1,562",
      "expectedResolutionDate": "2027-02-15",
      "resolutionSource": "OHCHR / UN Human Rights Monitoring Mission in Ukraine, monthly Protection of Civilians reporting",
      "resolutionSourceIds": [
        "ohchr-hrmmu-ukraine"
      ],
      "sourcePublicationSchedule": "Monthly Protection of Civilians reporting, published mid-month for the prior month.",
      "targetDefinition": "Resolves TRUE if OHCHR/HRMMU's published monthly Protection of Civilians reporting shows any single month from July 2026 through December 2026 with total verified civilian casualties (killed + injured) exceeding 1,562 — the H1 2026 monthly average derived from OHCHR's reported 1,396 killed and 7,978 injured across six months. Resolves FALSE if no month in that window exceeds it. Resolves UNRESOLVABLE if OHCHR ceases monthly publication.",
      "unit": "probability band",
      "scoringMethod": "threshold",
      "naiveBaseline": "Persistence: assume the indicator stays on its current side of the threshold.",
      "delayedPublicationFallback": "Stays nearing-resolution through the 45-day conflict grace period, then enters the resolution-data-overdue queue. It is never scored against a substitute measure to beat a deadline.",
      "definitionChangeFallback": "If the published metric's definition no longer matches the target definition, the resolution engine refuses to score and the record is classified unresolvable with a public reason.",
      "nearingResolutionAt": "2027-01-01",
      "expiresAt": "2027-04-01",
      "unresolvableReviewAt": "2027-08-14",
      "readyToScore": true,
      "blockers": []
    },
    {
      "forecastId": "fc-2026-07-18-ukraine-reconstruction-estimate",
      "slug": "ukraine-reconstruction-needs-next-assessment",
      "title": "The next Ukraine RDNA raises the ten-year reconstruction estimate above $588 billion",
      "domain": "macro",
      "targetPeriod": "The next published RDNA edition estimates total ten-year needs above $588 billion",
      "expectedResolutionDate": "2027-12-31",
      "resolutionSource": "World Bank Group Rapid Damage and Needs Assessment (RDNA) series press release and report",
      "resolutionSourceIds": [
        "worldbank-rdna5",
        "worldbank"
      ],
      "sourcePublicationSchedule": "Roughly annual RDNA editions; no announced date for the next.",
      "targetDefinition": "Resolves TRUE if the next Rapid Damage and Needs Assessment edition published after 18 July 2026 by the World Bank Group with the Government of Ukraine, European Commission and UN states total recovery and reconstruction needs strictly greater than $588 billion in nominal US dollars. Resolves FALSE if the figure is equal or lower. Resolves UNRESOLVABLE if no new RDNA edition is published before 31 December 2027, or if the successor assessment changes units or scope so that no comparable total exists.",
      "unit": "probability band",
      "scoringMethod": "threshold",
      "naiveBaseline": "Persistence: assume the indicator stays on its current side of the threshold.",
      "delayedPublicationFallback": "Stays nearing-resolution through the 180-day macro grace period, then enters the resolution-data-overdue queue. It is never scored against a substitute measure to beat a deadline.",
      "definitionChangeFallback": "If the published metric's definition no longer matches the target definition, the resolution engine refuses to score and the record is classified unresolvable with a public reason.",
      "nearingResolutionAt": "2027-10-02",
      "expiresAt": "2028-06-28",
      "unresolvableReviewAt": "2028-12-30",
      "readyToScore": true,
      "blockers": []
    },
    {
      "forecastId": "fc-2026-07-18b-hormuz-transits-portwatch",
      "slug": "hormuz-transits-below-portwatch-baseline",
      "title": "Strait of Hormuz daily transits stay below the PortWatch peacetime baseline through October 2026",
      "domain": "shipping",
      "targetPeriod": "IMF PortWatch's average daily Hormuz transit calls for October 2026 remain below 88 per day (its stated peacetime baseline)",
      "expectedResolutionDate": "2026-11-30",
      "resolutionSource": "IMF PortWatch daily chokepoint transit calls, Strait of Hormuz series",
      "resolutionSourceIds": [
        "imf-portwatch-chokepoints",
        "eia-steo"
      ],
      "sourcePublicationSchedule": "Monthly, typically in the first full week; the July 2026 edition published 7 July with a 1 July data cutoff.",
      "targetDefinition": "Resolves TRUE if IMF PortWatch's published daily Hormuz transit-call series averages below 88 calls per day across October 2026. Resolves FALSE if the October 2026 average is 88 or above. PortWatch is the sole deciding source: no news report, tracker, or commercial estimate may substitute for it. If PortWatch discontinues the Hormuz series or changes its transit-call definition incompatibly, this resolves UNRESOLVABLE rather than being scored against a different measure.",
      "unit": "probability band",
      "scoringMethod": "threshold",
      "naiveBaseline": "Persistence: assume the indicator stays on its current side of the threshold.",
      "delayedPublicationFallback": "Stays nearing-resolution through the 45-day shipping grace period, then enters the resolution-data-overdue queue. It is never scored against a substitute measure to beat a deadline.",
      "definitionChangeFallback": "If the published metric's definition no longer matches the target definition, the resolution engine refuses to score and the record is classified unresolvable with a public reason.",
      "nearingResolutionAt": "2026-10-16",
      "expiresAt": "2027-01-14",
      "unresolvableReviewAt": "2027-05-29",
      "readyToScore": true,
      "blockers": []
    }
  ],
  "dryRun": [
    {
      "scenario": "forecast correct (revision was upward, as predicted)",
      "forecastId": "fc-2026-07-18-eia-brent-revision",
      "outcomeSummary": "FIXTURE: the August STEO raises its 4Q2026 Brent forecast to $76.50/b from $70.00/b.",
      "preview": {
        "method": "revision",
        "scoredAt": "2026-08-11",
        "resolutionSourceId": "eia-steo",
        "sourcePublicationDate": "2026-08-11",
        "retrievedDate": "2026-08-11",
        "observedValue": 76.5,
        "observedUnit": "USD/barrel",
        "observedPeriod": "4Q2026 forecast in the August 2026 STEO",
        "observedEventOccurred": true,
        "observedOutcomeSummary": "FIXTURE: the August STEO raises its 4Q2026 Brent forecast to $76.50/b from $70.00/b.",
        "definitionMatch": true,
        "originalRuleFollowedExactly": true,
        "brierScore": 0.09,
        "directionallyCorrect": true,
        "revisionMagnitude": 6.5,
        "revisionDirection": "up"
      },
      "wouldBeStatus": "resolved",
      "originalPredictionUnchanged": true
    },
    {
      "scenario": "forecast wrong (revision was downward)",
      "forecastId": "fc-2026-07-18-eia-brent-revision",
      "outcomeSummary": "FIXTURE: the August STEO cuts its 4Q2026 Brent forecast to $66.00/b.",
      "preview": {
        "method": "revision",
        "scoredAt": "2026-08-11",
        "resolutionSourceId": "eia-steo",
        "sourcePublicationDate": "2026-08-11",
        "retrievedDate": "2026-08-11",
        "observedValue": 66,
        "observedUnit": "USD/barrel",
        "observedEventOccurred": false,
        "observedOutcomeSummary": "FIXTURE: the August STEO cuts its 4Q2026 Brent forecast to $66.00/b.",
        "definitionMatch": true,
        "originalRuleFollowedExactly": true,
        "brierScore": 0.49,
        "directionallyCorrect": false,
        "revisionMagnitude": 4,
        "revisionDirection": "down"
      },
      "wouldBeStatus": "resolved",
      "originalPredictionUnchanged": true
    },
    {
      "scenario": "observation falls outside the published interval",
      "forecastId": "fc-2026-07-18-sudan-idp-threshold",
      "outcomeSummary": "FIXTURE: DTM reports 7.4 million IDPs — below the 8 million threshold, so the forecast is wrong.",
      "preview": {
        "method": "threshold",
        "scoredAt": "2026-11-01",
        "resolutionSourceId": "iom-dtm-sudan",
        "sourcePublicationDate": "2026-11-01",
        "retrievedDate": "2026-11-01",
        "observedValue": 7400000,
        "observedUnit": "people",
        "observedPeriod": "DTM round, October 2026",
        "observedEventOccurred": false,
        "observedOutcomeSummary": "FIXTURE: DTM reports 7.4 million IDPs — below the 8 million threshold, so the forecast is wrong.",
        "definitionMatch": true,
        "originalRuleFollowedExactly": true,
        "brierScore": 0.7656,
        "directionallyCorrect": false
      },
      "wouldBeStatus": "resolved",
      "originalPredictionUnchanged": true
    },
    {
      "scenario": "resolution source delayed past its expected date",
      "forecastId": "fc-2026-07-18-eia-brent-revision",
      "outcomeSummary": "FIXTURE: the August STEO slipped to late September; scored on the original rule once published, with the delay noted.",
      "preview": {
        "method": "revision",
        "scoredAt": "2026-09-20",
        "resolutionSourceId": "eia-steo",
        "sourcePublicationDate": "2026-09-20",
        "retrievedDate": "2026-09-20",
        "observedValue": 74,
        "observedEventOccurred": true,
        "observedOutcomeSummary": "FIXTURE: the August STEO slipped to late September; scored on the original rule once published, with the delay noted.",
        "definitionMatch": true,
        "originalRuleFollowedExactly": true,
        "analystNote": "Publication was delayed beyond the expected date. The original resolution rule was applied unchanged; only the scoring date moved.",
        "brierScore": 0.09,
        "directionallyCorrect": true,
        "revisionMagnitude": 4,
        "revisionDirection": "up"
      },
      "wouldBeStatus": "resolved",
      "originalPredictionUnchanged": true
    },
    {
      "scenario": "source definition changed incompatibly",
      "forecastId": "fc-2026-07-18-eia-brent-revision",
      "outcomeSummary": "FIXTURE: no comparable 4Q2026 Brent forecast is published after a methodology change.",
      "preview": {
        "method": "revision",
        "scoredAt": "2026-08-11",
        "resolutionSourceId": "eia-steo",
        "sourcePublicationDate": "2026-08-11",
        "retrievedDate": "2026-08-11",
        "observedOutcomeSummary": "FIXTURE: no comparable 4Q2026 Brent forecast is published after a methodology change.",
        "definitionMatch": false,
        "definitionMatchNote": "FIXTURE: the EIA restructured STEO to publish a blended global benchmark instead of a discrete 4Q2026 Brent line, so no comparable figure exists.",
        "originalRuleFollowedExactly": true,
        "analystNote": "Refused to score against a different measure; classified unresolvable per policy.",
        "notScored": "The published metric's definition does not match this forecast's target definition, so scoring it would compare unlike things. Classify as unresolvable rather than scoring against a substitute measure."
      },
      "wouldBeStatus": "unresolvable",
      "refusalReason": "The published metric's definition does not match this forecast's target definition, so scoring it would compare unlike things. Classify as unresolvable rather than scoring against a substitute measure.",
      "originalPredictionUnchanged": true
    },
    {
      "scenario": "substitute source used without a public note (must be refused)",
      "forecastId": "fc-2026-07-18-eia-brent-revision",
      "outcomeSummary": "FIXTURE: an attempt to resolve using a weak substitute source with no analyst note.",
      "preview": null,
      "wouldBeStatus": "refused",
      "refusalReason": "fc-2026-07-18-eia-brent-revision used a substitute resolution source but supplied no analyst note. A substitute source requires a public resolution note (see /forecasting-policy).",
      "originalPredictionUnchanged": true
    }
  ],
  "sourceSnapshots": [
    {
      "forecastId": "fc-2026-07-18-eu-21st-package",
      "sourceId": "eu-council-sanctions",
      "role": "resolution-source",
      "capturedAt": "2026-07-18",
      "sourcePublishedDate": "2026-06-15",
      "metricRelied": "Whether a package designated the 21st has been legally adopted by the Council",
      "figureAtCapture": "20th package adopted 23 April 2026; a supplementary 'mini' package adopted 15 June 2026; a 21st package proposed by the Commission on 9 June 2026 and still under member-state negotiation.",
      "readDirectlyFromPublisher": false,
      "provenanceNote": "Adoption dates confirmed via law-firm and trade-compliance summaries of Council actions; the Council publishes adopted acts but not live negotiating positions."
    },
    {
      "forecastId": "fc-2026-07-18-suez-transits-depressed",
      "sourceId": "sca-chairman-statement-2026",
      "role": "supporting",
      "capturedAt": "2026-07-18",
      "sourcePublishedDate": "2026-03-01",
      "metricRelied": "Vessel transits, net tonnage and revenue year to date, versus the same period a year earlier",
      "figureAtCapture": "1,315 vessels / 56m net tons / $449m since the start of 2026, versus 1,243 vessels / 47m net tons / $368m in the same 2025 period; FY H1 improvement of 5.8% vessels, 16% tonnage, 18.5% revenue.",
      "readDirectlyFromPublisher": false,
      "provenanceNote": "A named statement by SCA chairman Ossama Rabiee at MARLOG 15, read via regional press; the SCA statistics portal was not directly reachable."
    },
    {
      "forecastId": "fc-2026-07-18-suez-transits-depressed",
      "sourceId": "imf-portwatch-chokepoints",
      "role": "resolution-source",
      "capturedAt": "2026-07-18",
      "sourcePublishedDate": null,
      "metricRelied": "Suez transit calls and deadweight tonnage relative to the 2023 pre-disruption baseline",
      "figureAtCapture": "Independent analysis of PortWatch/DWT data placed 2025 Suez transits roughly 57-64% below 2023; 2023 itself saw more than 26,000 transits.",
      "readDirectlyFromPublisher": false,
      "provenanceNote": "PortWatch dashboards are JavaScript-rendered; figures read via analysis citing PortWatch."
    },
    {
      "forecastId": "fc-2026-07-18-suez-transits-depressed",
      "sourceId": "logistics-trade-press-redsea",
      "role": "context-only",
      "capturedAt": "2026-07-18",
      "sourcePublishedDate": null,
      "metricRelied": "Carrier routing intent (not transit counts)",
      "figureAtCapture": "CMA CGM stated a Q2 2026 Suez return; Maersk described a stepwise approach; Hapag-Lloyd remained cautious; most carriers retained Cape of Good Hope as default.",
      "readDirectlyFromPublisher": false,
      "provenanceNote": "Freight-forwarder and logistics trade press. Commercial interest in freight demand. Cannot resolve the forecast."
    },
    {
      "forecastId": "fc-2026-07-18-eia-brent-revision",
      "sourceId": "eia-steo",
      "role": "resolution-source",
      "capturedAt": "2026-07-18",
      "sourcePublishedDate": "2026-07-07",
      "metricRelied": "STEO published Brent spot price forecast for 4Q2026",
      "figureAtCapture": "July 2026 STEO (released 7 July, data cutoff 1 July): 4Q2026 Brent $70.00/b; 3Q2026 $74.03/b; 2026 annual average $81.91/b, revised down from $95.39/b in the June STEO.",
      "readDirectlyFromPublisher": false,
      "provenanceNote": "STEO figures read via trade reporting of the 7 July release; the STEO PDF itself was not transcribed directly."
    },
    {
      "forecastId": "fc-2026-07-18-eia-brent-revision",
      "sourceId": "hormuz-crisis-tracking",
      "role": "context-only",
      "capturedAt": "2026-07-18",
      "sourcePublishedDate": null,
      "metricRelied": "Post-cutoff supply-risk developments not reflected in the July STEO",
      "figureAtCapture": "Reported renewed vessel strikes near Hormuz from 7 July 2026, escalating 11-13 July, including a reported ADNOC-operated vessel hit and one reported mariner death.",
      "readDirectlyFromPublisher": false,
      "provenanceNote": "News aggregation and independent trackers; single- or thinly-sourced. Context only, cannot resolve."
    },
    {
      "forecastId": "fc-2026-07-18-sudan-idp-threshold",
      "sourceId": "iom-dtm-sudan",
      "role": "resolution-source",
      "capturedAt": "2026-07-18",
      "sourcePublishedDate": "2026-04-12",
      "metricRelied": "National IDP total from DTM displacement and return snapshots",
      "figureAtCapture": "8,936,175 IDPs and 3,994,019 returnees as of 29 March 2026; down 23% from the 11,585,384 peak; roughly 350,000 newly displaced between October 2025 and March 2026.",
      "readDirectlyFromPublisher": false,
      "provenanceNote": "DTM PDF snapshots were not directly retrievable (403); figures read via DTM report summaries and ReliefWeb syndication."
    },
    {
      "forecastId": "fc-2026-07-18-ukraine-civilian-casualty-trend",
      "sourceId": "ohchr-hrmmu-ukraine",
      "role": "resolution-source",
      "capturedAt": "2026-07-18",
      "sourcePublishedDate": "2026-07-14",
      "metricRelied": "Monthly verified civilian casualties (killed plus injured)",
      "figureAtCapture": "H1 2026: 1,396 killed and 7,978 injured (monthly average approx. 1,562). June 2026: 293 killed, 1,990 injured — the highest monthly total since April 2022. Cumulative since 24 Feb 2022: 16,431 killed, 48,613 injured.",
      "readDirectlyFromPublisher": true,
      "provenanceNote": "Read directly from ukraine.ohchr.org reporting."
    },
    {
      "forecastId": "fc-2026-07-18-ukraine-reconstruction-estimate",
      "sourceId": "worldbank-rdna5",
      "role": "resolution-source",
      "capturedAt": "2026-07-18",
      "sourcePublishedDate": "2026-02-23",
      "metricRelied": "Total ten-year recovery and reconstruction needs",
      "figureAtCapture": "RDNA5 (data as of 31 Dec 2025): needs of almost $588bn over ten years; direct damage over $195bn, up from $176bn in RDNA4; largest sectors transport >$96bn, energy ~$91bn, housing ~$90bn.",
      "readDirectlyFromPublisher": false,
      "provenanceNote": "Read via the World Bank press release summary and UN syndication rather than the full RDNA5 report PDF."
    },
    {
      "forecastId": "fc-2026-07-18b-hormuz-transits-portwatch",
      "sourceId": "imf-portwatch-chokepoints",
      "role": "resolution-source",
      "capturedAt": "2026-07-18",
      "sourcePublishedDate": null,
      "metricRelied": "Daily Hormuz transit calls, and the stated peacetime baseline",
      "figureAtCapture": "Peacetime baseline reported as approximately 88 commercial vessels per day; 10 transits recorded on 12 July 2026. Series covers 28 chokepoints, updated weekly, downloadable as CSV/GeoJSON.",
      "readDirectlyFromPublisher": false,
      "provenanceNote": "PortWatch dashboards are JavaScript-rendered and could not be transcribed directly; figures read via reporting citing PortWatch. Reading the CSV/API export directly is the outstanding hardening step."
    },
    {
      "forecastId": "fc-2026-07-18b-hormuz-transits-portwatch",
      "sourceId": "hormuz-crisis-tracking",
      "role": "context-only",
      "capturedAt": "2026-07-18",
      "sourcePublishedDate": null,
      "metricRelied": "Narrative context on the June 2026 memorandum and July escalation",
      "figureAtCapture": "17-18 June 2026 U.S.-Iran memorandum opening a 60-day negotiating window; a reported recovery to 38-43 daily transits; strikes reportedly resuming 7 July and escalating 11-13 July.",
      "readDirectlyFromPublisher": false,
      "provenanceNote": "Independent trackers and news aggregation. Note the 38-43/day figure conflicts with PortWatch-derived reporting of far lower counts — a live disagreement, not a settled number. Context only."
    }
  ]
}