demo · watch it turn
The Whirlpool
Rock–paper–scissors never settles. A coordination game does. This figure shows why: the same nine states, the same rule for moving between them, and one dial that decides whether the flow along every edge cancels or goes round in a loop for ever.
Drag the game from a landscape to a whirlpool
These nine circles are the nine things that can be true at once when two players each pick rock, paper or scissors. Probability moves between them one player at a time. Grab the knob and change what kind of game it is.
Circle size is how often that pair of moves occurs. An arrowed edge carries net flow in the arrow's direction; a thin dashed edge is one where the two directions cancel exactly.
◉ whirlpool
The edges no longer cancel. Probability circulates round a loop for as long as the game exists, and the entropy-production counter is the price of keeping it turning.
Show the maths
The chain is the Glauber (logit revision) dynamic on the nine joint profiles: at each step one player is drawn at random and redraws its action from softmax(λ · ui(other's current action)). π is its stationary distribution by power iteration to 10⁻¹⁵; the net current on an edge is Jxy = πxWxy − πyWyx; entropy production is Schnakenberg's σ = Σx<y (πxWxy − πyWyx) log(πxWxy / πyWyx), in nats per step.
At α = 0 the game is an exact potential game, the chain satisfies detailed balance with respect to exp(λ·potential), and σ vanishes identically. In float64 it reads 9.615e-1 and the largest net current reads 3.458e-2. The committed benchmark makes the same statement on the library's exact solver: benchmarks/results/equilibrium_reads_zero.json records max_epr = 4.19e-30, max_current = 9.71e-17 over its potential-game suite, and benchmarks/results/ness_reads_positive.json records min_epr = 1.568 over its harmonic suite.
α here is the convex mixing weight between the coordination game and rock–paper–scissors, not the Hodge harmonic fraction of the normalised game — those differ, which is why Colonel Blotto reads α = 0.694 rather than 1 (benchmarks/results/blotto_readings.json).