● S4 WebGPU wasm32

Bracket

Matchmaking, rating and a ladder, with no game attached. Players queue, get paired, a stub decides who won, and the numbers move.

bracket — crcbl
Starting…
Click the canvas first. A canvas has to hold keyboard focus to receive keys, and browsers will not start audio until you have interacted with the page. Clicking away pauses the game and lets go of whatever key was held — no platform sends the release for a key that was down when focus left.
Touch reaches the engine. A contact arrives as an ordinary pointer, and the first one is also the gesture a browser waits for before it will start audio. Whether this demo can be played with one is in its controls below — not all of them can. Switching tabs pauses the game and lets go of whatever was held: no platform sends the release for an input that was down when focus left.

controls

There is nothing to play. That is the point.

what is actually running

Matchmaking quality is a property of a population, not of one match.

A matchmaker that pairs well for four players and badly for four thousand is a matchmaker nobody has tested. Attaching one to a real game would mean needing a real playerbase before you could learn anything about it, so this sample has no game: the match is resolved by a seeded roll weighted by the two players' true skill, and a population of any size runs deterministically from a seed.

Every player here has a true skill that the matchmaker never sees — it is the mark drawn across each bar on the ladder. The bar itself is what the system currently believes, and the whole exercise is getting the one to land on the other. The CONVERGENCE plot is the distance between them, averaged over everybody, drawn as it falls. A rating system nobody can falsify is a number generator, so the number is on screen.

The queue is the other half. A waiting player will accept an opponent within a tolerance that widens the longer they wait, and the stricter of the two tolerances decides — so somebody who just joined is never dragged into a lopsided match by a player who has been waiting a long time. Both sides of that trade are reported rather than asserted: how far apart the average pairing was, and how long the average player waited for it.

One thing worth watching if you leave it running: the curve comes down, and then it slowly climbs again. That is not a bug in the arithmetic. Pairing people against their nearest equal means a small rating gap is preferentially drawn from pairs whose true skills are further apart than the ratings suggest, so the favourite wins a little more often than predicted and the ladder gradually stretches. Tight matchmaking and a trustworthy rating are genuinely in tension, and fixing it needs a rating that tracks how sure it is — not a change to who gets paired.

Open the console for the engine's log. The wasm module imports nothing, not even console.log, so log lines are queued inside wasm and drained by the page each frame. crcbl.audio(), crcbl.saves() and crcbl.logLevel(4) are there too.