The rule for winning this game is published in a hundred places and I copied it straight out of one of them. It is broken. I only know that because a bot played four hundred moves of nonsense and won.
What It Is
A 121-hole star. Ten marbles a side, from one point of the star to the point directly opposite. Move one step, or hop a chain as long as you can find one. Nothing is ever captured, and nobody is ever knocked out.
Two, three, four or six players. Every seat is a person on the same device or a bot at one of three strengths, so the same board handles a room with five people in it and a room with one. There is a Coach you can ask, and it is free.
Five players is not offered, and it is not coming. On a six-point star, five people leave one point empty, and the emptiness is not shared out evenly: one player races into a triangle nobody is vacating while another races into one being emptied for them. That is not a hard variant, it is a rigged one, and no seating order fixes it. I would rather say no than ship a greyed-out control, because a greyed-out control is a promise.
The Board Is Arithmetic, Not A Table
Most implementations of this board type out 121 holes and their neighbours. That is 121 chances to make a typo that nothing catches: the board renders, the game plays, and one hop somewhere is illegal forever for no visible reason.
So the star is derived instead. In cube coordinates it is exactly the union of two triangles of side 13, one pointing each way. Each triangle holds 91 holes. They overlap on the middle hexagon, which holds 61. So the board is 91 plus 91 minus 61, which is 121, and the six points are the 30 holes of each triangle sticking out past the hexagon, ten to a point.
The payoff is not elegance, it is that the move generator has no edge cases. A hop walks out along one direction to the first marble on the line and lands the same distance past it. Every hole along the way is either an index or -1 for “not a hole”, so that sentence is true in the middle of the board and at the tip of a point without a single boundary check. The short hop over a marble right next door is the same walk stopped after one step, which is why turning long jumps off caps the search instead of forking it. The opposite of a point is one negation rather than a lookup. And the count is the test: if the arithmetic is wrong, 121 stops being 121.
The Published Win Rule Hands Every Opponent A Veto
The naive rule is “you win when your destination triangle is full of your own marbles”. That rule lets me park one marble in your destination, never move it again, and you cannot win for the rest of the game no matter how well you play.
So the fix everyone publishes is: the destination is full, and at least one marble in it is yours. My spoiler marble now counts toward your win, so spoiling is pointless. I wrote that down, argued for it, and shipped it into the engine.
Then the self-play harness found what I had not. At two, four and six players, your destination triangle is an opponent’s home, and a home triangle starts completely full. So the position the rule describes already exists on move one. The opponent moves a single marble out, you walk a single marble in, and you have won with nine marbles still sitting at home. Random play found it inside four hundred plies.
The shipped rule adds a third condition: your own home triangle has to be empty. The Coach says it as “you have to get out of your own house before you can claim a blocked win”. Three players is immune either way, because there every target triangle starts empty, which is exactly why reading the rule carefully would never have caught this. The broken case is the common case.
I have left one hole open and written it down rather than quietly rounding it off: marbles parked in the middle of the board rather than at home still allow a thin version of the win. Closing that needs a reachability analysis over the hop graph, and building the position takes cooperation from both players. It is disclosed, not fixed.
A Coach That Only Says What It Can Prove
The blackjack trainer on this hub grades you. It can, because blackjack has one correct play per hand and a published chart to check it against. The grade is the product there.
This game has no such thing. There is no chart, no solved position, and no authority to appeal to. So the Coach here is allowed to return a verdict on exactly three things, all of which the move generator can prove without an opinion: you took a shorter chain when a longer one from the same marble also gained more ground, you took a single step when a chain existed, or you declined a legal entry into your destination.
A move that the evaluator merely scored lower is “fine”. Not a miss, not a warning, not a percentage. There is a test that constructs exactly that position and asserts “fine”, and mutating the code so a score gap produces a “miss” fails that one test and nothing else in the suite. That single test is the whole thing standing between this design and a coach that scolds a six-year-old for a move nobody can prove is wrong.
The Coach runs the same evaluator as the Hard bot, not a second one, because two independent scorers drift and the first symptom of drift is the Coach recommending a move the bot would not play, which reads as the game arguing with itself. It just searches harder: depth 3 and width 16 against the bot’s depth 2 and width 12, roughly sixteen times the work. It can afford that because you ask for it and wait, where the bot has to answer inside a turn. Measured worst case is 57.6 to 96.8 milliseconds on my desktop, which works out to roughly 250 to 290 on the cheapest phone I plan for.
Depth 4 is about 1.9 seconds on that phone, so depth is capped by the clock. Going wider than 16 changed the chosen move on 2 plies out of 166, so width is capped by diminishing returns. Both limits landing on the same number is the reason I trust it rather than a preference I am defending.
Three Thousand Bytes From Breaking Somebody Else’s Build
Imported normally, like most games on this hub, this one left the main bundle at 2,093,297 bytes against the service worker’s 2 MiB precache limit. That is 3,855 bytes of headroom for the entire hub, and the build still exited 0.
That is the part worth remembering. Nothing failed. Nothing warned. The next trivial change by anyone, in any of the other games, would have been the one that broke, and the person who broke it would have had no idea why.
Loading this game lazily moves 43,348 bytes into its own chunk and puts headroom back to 47,393. It is the third game to go this way for this exact reason, after craps and blackjack, so it has stopped being an incident and is now a rule: a game carrying an engine, a bot and a coach does not belong in the precached main chunk. Most visitors never open any given game, so precaching all of them for everybody was the wrong trade before it was nearly a broken one.
No Marble Is Green
The physical set has a green marble. This one does not, because the hub’s brand file reserves its one identity green for the platform itself, and on a board this dense a green marble reads as furniture rather than as a player.
Six seats is well past the point where hue alone is safe for anyone. So the six colours are spread across lightness from 0.45 to 0.82 as well as around the wheel, because lightness survives colour blindness and a greyscale screenshot, and seats fill the triangles in lightness order so the smallest games get the widest gaps. Every marble also carries its own glyph, so the whole game is playable with colour switched off entirely.
The game’s hub accent is oklch(0.50 0.150 8) in light and oklch(0.74 0.125 8)
in dark, sitting in the last real gap left on the hub’s colour wheel, with both
variants converted down to sRGB and checked in gamut before they were written,
because an out-of-gamut value gets silently clipped and the colour you get is not
the colour you asked for.
Where It Sits On The Hub, And Why I Overruled The Build
The build filed this under Pass and Play, next to Drop4, and wrote a test to pin it there. The argument was good: this is a German game, Stern-Halma, published in 1892 and renamed for American marketing in 1928, so putting it in the Nostalgic Chinese Games section on the strength of a marketing name would quietly make that section mean nothing.
I overruled it, and it now sits under Nostalgic Chinese Games. This is a reversal, recorded as one, because the original argument was made in public across three files and anybody reading them should be able to see which way it was settled.
The override is better reasoned than the rule it replaced. That section’s own comment defines it as “games actually played around a table growing up”. That is a question about whose table, not about where a game was invented, and I am the authority on my own childhood. The 1892 origin stays in the game’s own about text and in its documents, because it is true. It was just never a filing rule, and treating a fact about provenance as one was the original mistake. The test now pins the new placement and carries the reason, so the risk runs the other way: somebody “correcting” it back after reading the origin note fails CI.
The name itself stays. “Star Halma” would be historically tidier and would make the game unfindable to every person who has ever played it.
It Is Free
No coin gate, no unlock, no priced hint, no paid bot tier. The Coach is free and always at full strength, with no weaker version, because a weaker hint is a gate wearing a different word.
That is not generosity, it is that every candidate purchase fails the hub’s own rule that a purchase may never make a run easier and that unlocks sell variety rather than advantage. In a race with no capture and no score, anything worth paying for here is either a better move, which is advantage, or a rule change that the other people sitting at the same screen did not agree to. The Coach in particular is how a first-time player learns what a hop chain is, and charging for the tutorial is the wrong object to charge for.
What Is Not Done
209 tests across 11 files cover this game, and the hub’s full suite is 5,442 tests across 397 files, all passing. Every rule test was verified by mutation before it was trusted: break the rule, watch the test fail, put it back.
None of that is the same as the anti-blocking hole above being closed, and it is not the same as a five-player mode existing. There is no online play, no leaderboard, no streak, no daily, and no resume of a match in progress. A deeper Coach that could tell you what happens two turns out is a candidate and nothing more, because the useful hop ladders get built two turns out and I do not yet know whether that search fits in front of a waiting person.