Cascade · Weather → Grid → Price
A learned propagation operator over a 357-node graph of the European energy system. It reads two weeks of history at every node and forecasts where stress surfaces next, from six hours to fourteen days ahead.
Live above: the actual graph, every node and edge. Hover any node.
A cold, near-windless week over Germany is not one event. Gas burn climbs to cover the wind deficit; interconnector flows tighten across the continent; days later the strain surfaces as a price spike in Italy and a curtailment notice at an aluminium smelter. The shock propagates through physical infrastructure, market coupling and fuel logistics, with delays of hours to weeks.
Cascade models that propagation explicitly. Weather regions, generation fleets, interconnectors, gas hubs, river gauges, ports, prices, industries and companies become nodes; the couplings between them become edges. The unusual part is what the edges carry: each of the 675 edges holds a physical mechanism written in language (an LLM-enriched description of how the coupling works, embedded to 1024 dimensions), and the operator conditions its message passing on that text. Click any node in the case study below and you can read the mechanisms it is wired into.
For eighteen days a cold anomaly sat over north-west Europe while wind output collapsed: a 13-day wind drought at the peak of the gas crisis. Britain warmed its coal reserve and day-ahead power cleared above £600/MWh; the depleted Nordic hydro system set December price records. Cascade holds this episode out of training entirely.
The replay below is the test data itself, not a simulation: each node's daily peak stress, measured in standard deviations (|z|) against its own climatology. Press play and watch the shock enter through the weather nodes and surface in prices, gas hubs and industry.
Hand the operator any moment in a held-out year and ask which parts of the network will be under strain over the next one to fourteen days. It ranks stressed against quiet nodes at a median AUC of 0.74 across 21 test episodes spanning the 2022 energy crisis and the storm winter of 2024. Persistence, the strongest simple baseline, scores 0.65; a per-node GRU with the graph removed scores 0.67. Reading the graph closes a quarter of the distance between persistence and a perfect ranking, and the operator clears persistence's median on 18 of the 21 episodes it never trained on.
Whole-system stress ranking · AUC · held-out test years 2022 + 2024
The graph is doing the work: remove it (per-node GRU) and half the margin over persistence disappears; remove history too (climatology) and the ranking collapses to chance.
Ranking visible stress is what a grid operator needs. A reinsurer prices something harder: onset. Among the nodes that look healthy today, which will be disrupted by the end of the week? These are the newly-disrupted nodes, quiet for a week (|z| < 1.5) and then across the disruption threshold within the episode.
On this slice, persistence is structurally blind (AUC 0.34, worse than a coin flip), because a quiet node gives it nothing to extrapolate. That looks like open headroom for a model that reads the graph. It is not, and Cascade measures precisely why.
Three independent methods, one shared failure mode: every history-conditioned score ranks tomorrow's spikers below the nodes that stay calm.
Newly-disrupted ranking · pooled AUC, 95% bootstrap CI · val + test
The mechanism is a covariate shift, and it is structural rather than a tuning gap. The slice is defined as the quiet-before nodes, and a node's own quietness is the single strongest predictor that it stays quiet, so any score built on recent history sorts the eventual spikers to the bottom. Evidence for a quiet-then-spiking node has to arrive entirely through its graph neighbours, and on this graph that signal is too faint to overcome the node's own autocorrelation. The result is a boundary of predictability, measured three ways and explained by one mechanism. Knowing where that boundary sits, and being able to prove it, is worth as much to a risk carrier as another point of AUC.
Every edge carries an LLM-written description of its coupling, embedded to 1024 dimensions. The natural hypothesis: semantic edge conditioning should beat a bare 13-dimensional edge-type one-hot. The matched-capacity ablation (the two arms differ in a single input projection) says otherwise: text and one-hot tie at every cell of the evaluation.
A perturbation probe rules out the boring explanation. Shuffling embeddings within each edge type moves the operator's outputs by 0.47× their own scale: the model demonstrably reads the per-edge text. And a zero-shot test shows it leans on what it reads. Hold two edge types out of training and the text arm's error on the affected nodes degrades thirty times more than one-hot's (+0.042 versus +0.001 pinball), while control nodes stay flat for both. Per-edge semantics give the operator something specific to grip, and that grip becomes brittleness on an edge type it never saw.
Zero-shot edge-type holdout · Δ pinball loss when two edge types are withheld
In distribution, structure beats semantics on this graph. Because the operator provably uses the text, the null is a modelling result about language conditioning, not an artefact of a weak enrichment pipeline.
Every claim above rests on the evaluation harness, so the harness was built first and the models were judged against it unchanged.
train · validation · test, separated by a 336-hour guard band so no training window's forecast horizon reaches a held-out year.
The same scrutiny lands on the operator's own uncertainty. A pinball-trained forecaster should know how wide its world is: the P10–P90 band ought to cover 80% of outcomes. On test years it covers 66%. The median is nearly calibrated; both tails are too tight. Under-dispersion is the signature of a variance-shrinking objective, and it is the same mechanism behind the onset blindness of §04: the model thins exactly the tail where onset lives. One diagnosis explains both findings.
Quantile calibration · edge-text arm · 12,234 test positions
This page shows one episode in motion. The full pipeline, the 59-episode catalogue and the complete quantitative results live in the repository: github.com/wienkers/cascade.