THE GRID
Two control rooms. One blackout coming. Only one of them is allowed to imagine it.
This is the standard IEEE 39-bus New England test system — 39 buses, 46 transmission lines, 10 generators, 6,254 MW of load — the benchmark power system that has been used in stability research since 1979. The bus, branch and generator data below is the published case, taken unmodified from PYPOWER’s case39. A DC power flow, a thermal-overload cascade model and two controllers are compiled into 43 KB of WebAssembly and running on your machine right now. Both control rooms are told, eight control periods in advance, exactly which line is going to open. They run the identical code. One is allowed to imagine 14 periods forward. The other, three.
LEFT = the controller that looks 14 periods ahead. RIGHT = the same controller restricted to 3. Line colour is loading: blue under 65%, gold to 90%, amber to 100%, red over. The red creeping bar along a line is accumulated relay heat — when it fills, the relay opens and the flow lands on its neighbours. ✕ is an open line. Gold circles are generators, sized by output. Squares are load, turning red when the lights go out. The red glow on the left panel is the kill map: how often each line dies across the futures being imagined this instant. It is the machine seeing its own blackout before it happens. The lower panel is every one of those futures drawn as a load-served curve — the gold one is the future it acted on.
Measured, before the page was drawn
Every one of the 46 transmission lines was failed in turn, under 6 random seeds, at 100% and at 115% of nominal load. 552 scenarios per stress level, run headless through the exact WebAssembly module you just watched. Nothing below is hand-picked.
1 · The head-to-head
Deep = horizon 14, 64 rollouts. Myopic = horizon 3, 24 rollouts. Same code, same seed, same eight periods of advance warning, same grid. “No operator” is the grid left completely alone: relays and automatic balancing only.
| SYSTEM LOAD | TOTAL MW | DEEP WINS | MYOPIC WINS | TIE | MEAN DEEP | MEAN MYOPIC | MEAN NO-OP |
|---|---|---|---|---|---|---|---|
| 100% of nominal | 6,254.2 | 18 | 9 | 249 | 6,226.6 | 6,148.3 | 6,139.7 |
| 115% of nominal | 7,192.4 | 169 | 7 | 100 | 5,903.3 | 5,653.3 | 5,642.8 |
At nominal load the New England system is genuinely robust — 249 of 276 scenarios are a dead tie, because almost nothing bad happens and holding still is the right answer. Push it to a realistic summer peak and the picture inverts: the myopic room keeps the lights on for 5,653.3 MW, barely above the 5,642.8 MW you get with nobody in the room at all, while looking further ahead holds 5,903.3 MW. That gap — 261 MW, averaged over every single-line outage on the system — is roughly a large city. It is bought with nothing but imagination: no new wires, no new generation, no learning, no training data.
2 · The scaling law
This is the result that matters. Hold everything constant — same 276 scenarios at 115%, 64 rollouts — and turn one dial: how far forward the machine is allowed to imagine.
Horizon 1 lands on 5,642.8 MW — exactly the no-operator number, to the decimal. That is the sanity check: a machine that cannot see one step past its own action can never find a reason to deviate from holding still, so it holds still, so it is the empty control room. Everything above that line is purchased purely by looking further. The curve is not clean — horizon 16 is worse than horizon 14 — and it is printed here unsmoothed because that is what came out. Search over a chaotic cascading system is noisy; deeper is better on average, not on every run.
The cost column is the part utilities should read twice. A full horizon-14 decision — both control rooms and the untouched baseline — takes 4.18 milliseconds on one core of a laptop. Real control centres re-dispatch on a five-minute cycle. This is about seventy thousand times faster than the clock it would have to keep.
3 · How many futures
Same thing, other dial: horizon pinned at 14, vary how many futures get sampled per decision. One rollout is again exactly the empty room.
It saturates. Past about 64 futures per decision the returns are inside the noise — 80 rollouts scored 5,884.8, below 64’s 5,903.3. Depth of imagination buys more than breadth of it.
4 · Every line, at summer peak
All 46 branches of the case, each failed in turn, mean of 6 seeds at 115% load. Sorted by how much load the deep room saves over an empty one. Nothing removed.
| LINE | RATING | DEEP | MYOPIC | NO OPERATOR | SAVED |
|---|---|---|---|---|---|
| 16–21 | 600 MW | 6,135.0 | 5,084.2 | 5,084.2 | +1,050.8 |
| 23–24 | 600 MW | 6,131.6 | 5,084.2 | 5,084.2 | +1,047.4 |
| 17–18 | 600 MW | 6,390.4 | 6,065.4 | 5,542.3 | +848.1 |
| 16–17 | 600 MW | 5,970.2 | 5,188.3 | 5,188.3 | +781.9 |
| 6–11 | 480 MW | 5,877.4 | 5,161.1 | 5,163.2 | +714.2 |
| 3–18 | 500 MW | 6,530.7 | 5,878.4 | 5,878.4 | +652.3 |
| 10–13 | 600 MW | 5,800.7 | 5,153.4 | 5,153.4 | +647.3 |
| 4–5 | 600 MW | 5,436.9 | 4,791.4 | 4,791.4 | +645.5 |
| 10–11 | 600 MW | 5,735.2 | 5,153.4 | 5,153.4 | +581.8 |
| 13–14 | 600 MW | 5,591.3 | 5,227.5 | 5,089.4 | +501.9 |
| 15–16 | 600 MW | 6,377.8 | 5,878.4 | 5,878.4 | +499.4 |
| 2–25 | 500 MW | 6,728.0 | 6,327.0 | 6,327.0 | +401.0 |
| 14–15 | 600 MW | 6,227.2 | 5,878.4 | 5,878.4 | +348.8 |
| 2–3 | 500 MW | 6,150.1 | 5,878.4 | 5,878.4 | +271.7 |
| 5–6 | 1200 MW | 6,150.1 | 5,878.4 | 5,878.4 | +271.7 |
| 12–11 | 500 MW | 6,150.1 | 5,878.4 | 5,878.4 | +271.7 |
| 12–13 | 500 MW | 6,150.1 | 5,878.4 | 5,878.4 | +271.7 |
| 16–24 | 600 MW | 6,150.1 | 5,878.4 | 5,878.4 | +271.7 |
| 22–23 | 600 MW | 6,150.1 | 5,878.4 | 5,878.4 | +271.7 |
| 26–28 | 600 MW | 6,150.1 | 5,878.4 | 5,878.4 | +271.7 |
| 26–29 | 600 MW | 6,150.1 | 5,878.4 | 5,878.4 | +271.7 |
| 28–29 | 600 MW | 6,150.1 | 5,878.4 | 5,878.4 | +271.7 |
| 6–7 | 900 MW | 6,075.3 | 5,878.4 | 5,878.4 | +196.9 |
| 5–8 | 900 MW | 6,051.6 | 5,878.4 | 5,878.4 | +173.2 |
| 1–39 | 1000 MW | 6,109.1 | 5,990.6 | 5,990.6 | +118.5 |
| 7–8 | 900 MW | 5,953.1 | 5,878.4 | 5,878.4 | +74.7 |
| 3–4 | 500 MW | 5,949.5 | 5,878.4 | 5,878.4 | +71.1 |
| 9–39 | 900 MW | 6,231.3 | 6,160.2 | 6,160.2 | +71.1 |
| 4–14 | 500 MW | 5,923.6 | 5,878.4 | 5,878.4 | +45.2 |
| 21–22 | 900 MW | 4,825.6 | 4,781.4 | 4,781.4 | +44.2 |
| 20–34 | 900 MW | 5,330.3 | 5,324.9 | 5,324.9 | +5.4 |
| 16–19 | 600 MW | 5,473.3 | 5,469.3 | 5,469.3 | +4.0 |
| 19–33 | 900 MW | 5,165.2 | 5,161.3 | 5,161.3 | +3.9 |
| 22–35 | 900 MW | 5,125.4 | 5,121.5 | 5,121.5 | +3.9 |
| 23–36 | 900 MW | 5,247.0 | 5,243.1 | 5,243.1 | +3.9 |
| 6–31 | 1800 MW | 5,183.9 | 5,180.1 | 5,180.1 | +3.8 |
| 10–32 | 900 MW | 5,080.3 | 5,078.4 | 5,078.4 | +1.9 |
| 1–2 | 600 MW | 5,878.4 | 5,878.4 | 5,878.4 | +0.0 |
| 2–30 | 900 MW | 6,327.0 | 6,327.0 | 6,327.0 | +0.0 |
| 8–9 | 900 MW | 6,167.7 | 6,167.7 | 6,167.7 | +0.0 |
| 17–27 | 600 MW | 6,201.5 | 6,201.5 | 6,201.5 | +0.0 |
| 19–20 | 900 MW | 6,918.4 | 6,745.0 | 6,918.4 | +0.0 |
| 25–26 | 600 MW | 6,020.6 | 6,020.6 | 6,020.6 | +0.0 |
| 25–37 | 900 MW | 5,763.0 | 5,763.0 | 5,763.0 | +0.0 |
| 26–27 | 600 MW | 5,878.4 | 5,878.4 | 5,878.4 | +0.0 |
| 29–38 | 1200 MW | 4,390.7 | 4,392.1 | 4,392.1 | -1.4 |
5 · Where looking further made it worse
7 of 276 runs at summer peak, and 9 of 276 at nominal, the myopic room beat the deep one. Here is every one of them, unedited. In most cases the deep room spent a few megawatt-hours probing a redispatch that did not pay off; in run 13–14 at seed 7 it lost 460 MW outright by committing to a path the shallow room never explored. Search is not a guarantee. It is a better bet.
| LOAD | LINE | SEED | DEEP | MYOPIC | NO OPERATOR | COST |
|---|---|---|---|---|---|---|
| 115% | 13–14 | 7 | 5,163.2 | 5,622.8 | 5,089.4 | -459.6 |
| 115% | 21–22 | 29 | 4,771.1 | 4,781.4 | 4,781.4 | -10.3 |
| 115% | 21–22 | 101 | 4,772.8 | 4,781.4 | 4,781.4 | -8.6 |
| 115% | 29–38 | 617 | 4,386.5 | 4,392.1 | 4,392.1 | -5.6 |
| 115% | 29–38 | 2026 | 4,390.8 | 4,392.1 | 4,392.1 | -1.3 |
| 115% | 10–13 | 4099 | 5,140.5 | 5,153.4 | 5,153.4 | -12.9 |
| 115% | 29–38 | 4099 | 4,390.8 | 4,392.1 | 4,392.1 | -1.3 |
| 100% | 6–31 | 7 | 6,240.2 | 6,254.2 | 6,254.2 | -14.0 |
| 100% | 23–36 | 7 | 6,226.8 | 6,254.2 | 6,254.2 | -27.4 |
| 100% | 13–14 | 101 | 6,240.2 | 6,254.2 | 6,254.2 | -14.0 |
| 100% | 20–34 | 101 | 6,240.2 | 6,254.2 | 6,254.2 | -14.0 |
| 100% | 6–31 | 617 | 6,240.2 | 6,254.2 | 6,254.2 | -14.0 |
| 100% | 10–32 | 2026 | 6,240.2 | 6,254.2 | 5,025.5 | -14.0 |
| 100% | 20–34 | 2026 | 6,240.2 | 6,254.2 | 6,254.2 | -14.0 |
| 100% | 16–19 | 4099 | 6,240.2 | 6,254.2 | 6,254.2 | -14.0 |
| 100% | 19–33 | 4099 | 6,240.2 | 6,254.2 | 5,098.5 | -14.0 |
What this is, and what it is not
IEEE 39-bus New England, the standard test system since 1979, taken unmodified from PYPOWER’s case39: 39 buses, 46 branches with their real thermal ratings, 10 generators with real limits, 6,254.23 MW of load. The base-case flow solution here agrees with PYPOWER’s own DC solver.
No real operator’s topology, no real telemetry, no real market. A benchmark case is a laboratory, not a control room. Anyone claiming a browser demo fixes a real grid is lying to you.
Linearised: no voltage, no reactive power, no transient stability, no frequency dynamics. The standard first-order tool for exactly this kind of contingency screening, and genuinely inadequate for the voltage-collapse blackouts that DC flow cannot see.
Overloaded lines accumulate heat proportional to how far over rating they are and the relay opens at a fixed threshold. Real protection is far messier — distance relays, hidden failures, operator intervention. Our cascade is deterministic and ours.
No weights, no training set, no gradient, no model of any kind. The machine plays the physics forward with a random number generator, keeps the first move of the best future it found, and throws away every other future it imagined. That is the entire algorithm.
Same C, same physics, same seed stream, same eight periods of warning. The first rollout of every decision is always “hold”, and a room only deviates from holding if a future strictly beats it. That is why the myopic room lands on the no-operator number instead of below it. Without that rule the comparison would be a strawman, and an earlier version of this page would have been one.
Bus positions come from a force-directed layout of the electrical graph, not from geography. New England does not look like that.
Value of an imagined future = megawatts served, summed over the horizon. No penalty terms, no weights, no hand-tuning. We tried tuned objectives during prototyping and deleted them, because a tuned objective is a place to hide.