scrabble engine flaws ii
Previously on Apriiori, I expressed some skepticism of the common stance that engines aren’t yet cleanly superior to human players. I absolutely buy the case that Scrabble is nowhere close to computers having the same superiority that they do in chess or Go — but I’m still not sure anyone can point to a particular position where Macondo makes a move that can be decisively proven to be worse than one a human would play. This does, however, come down partially to my having pretty high standards for what constitutes a “decisive proof”: commenters on the previous article gave some pretty credible arguments. I am at this point pretty convinced that a rigorous proof could be put together if someone tried, but I think making the argument fully mathematically rigorous is difficult.
anon: Macondo has clear deficiencies. For most of the game it has two modes: static and sim. Sim is generally preferred, and I think empirically 5-ply sim has had best results. But 5-ply sim is Monte Carlo using an empirical winrate lookup table at the end of a 5-turn rollout assuming both players play like a simple static evaluation (that is, playing solely based on points + rack leave value). So it models its future self poorly, and potentially its opponent as well. This is basically unchanged from Quackle, see http://www.breakingthegame.net/computers511 They actually linked http://www.breakingthegame.net/computers3, but then corrected themselves and said they meant 5. .
I agree that Macondo has many of the same questionable structural traits that lead to arguable Quackle issues. I had Opus 5.5 look through Macondo’s code and check whether each of the complaints made about Quackle are still true of Macondo:
| Weakness | Macondo? | In the code (commit 14c080b5) |
|---|---|---|
| Fishes only once: in the sim, your future self abandons a fish after one miss | Yes | Every simulated turn after the candidate is the single best static-equity play, with no lookahead. So the simulated player keeps a fish only if the generic leave value happens to favour it (it kept BEZ 16% of the time after a miss).montecarlo.go bestStaticTurn → GenBestStaticTurn |
| Simulated opponent doesn’t react to you, e.g. doesn’t block your fish | Yes | Same greedy rule for the opponent. Equity is score + leave value + endgame-phase adjustments, with no defensive or blocking term anywhere.turnplayer/utils.go; equity/combined.go Equity() |
| Simulated opponent opens hooks for you | Yes | Follows from the same rule: nothing penalises a play for what it opens.equity/combined.go Equity() |
| Weak simulated replies in general | Yes | Simulated replies are one-ply static picks, so they are exactly as good as the static evaluator. A randomised top-2 variant exists but is off by default.turnplayer/utils.go GenStochasticStaticTurn (config-gated) |
| No inference: the opponent’s leave is treated as random | Partly | Macondo’s standard simming bot draws the simulated opponent’s rack uniformly at random. A separate inference bot guesses the opponent’s rack from his last play, but in neither does the simulated opponent infer ours.game.go SetRandomRack; rangefinder/inference.go |
| Leave values don’t know the board (OS for QUARTZOUS, S for IODIZERS, BEZ for BENZOATE) | Yes | Leave value is a table lookup keyed only by the sorted tiles kept; the board is never an input.equity/read_klv.go KLV.LeaveValue |
| Board-blind spread-to-win% table where the sim stops | Yes | Win% comes from a table indexed only by spread and tiles unseen. With more than 14 tiles unseen, BestBot’s sims stop after 2 plies and use it; with 9–14 unseen they run about to the end of the game.montecarlo.go addWinPctStat; ai/bot/elite.go |
Macondo does not have all the same issues Quackle does — it does some inference, as discussed in the previous article, and it also can solve end-games if ran long enough (though the Woogles BestBot doesn’t always fully solve the end-games, and doesn’t use Macondo’s inference system). But it has a lot of them.
The thing is, while I agree these are all legitimate imperfections, I sort of suspect a lot of them are still there just because they end up pretty much being good enough approximations in practice, most of the time? It seems to me at least possible to argue that Macondo doesn’t make any outright errors on the positions Matsumoto22 The author of Breaking the Game. brings up. I think some of the positions could pretty plausibly be firmly established to be Macondo errors, but I wasn’t myself able to do this by spending some time hacking away at it with Claude.
| Position | Article | Quackle | Macondo (deep sims) | What our checks found |
|---|---|---|---|---|
KOAAACHKOS | SHAKO(S) | KOA | Agrees with Quackle (KOA/HAO, +1.8%); its 2-ply bot setting plays SHAKO(S) | Taking his premise that strong opponents won’t open IODIZER, Macondo’s own playouts flip to SHAKO(S) by 1–2 points of win% (blocks exist but need an R, via (A)R_ words through REVIVER; unmodelled). The live 2-ply bot already plays SHAKO(S); only deeper sims prefer KOA/HAO |
KIBOSHHIIKLOS | ILK; KIBOSH is “a serious error” | KIBOSH | Near tie, leaning ILK (+0.7%); its bot setting plays KIBOSH | Making the simulated player keep OS moved the comparison by about ½% in our tests; the opponent also uses the QUARTZ spot in about 17% of simulated games |
TARTAEIRRTT | (FLAKE)R, “far superior” | Dead heat | Agrees with Quackle, leaning TART (+1.2%) | An opponent using Macondo’s own rack inference does open less after both moves, but that cuts FLAKER’s bingo chances at least as much (FLAKER’s lanes are the open ones it closes); FLAKER stays 2–3% behind. Caveat: that inference read “strong rack” after FLAKER, not AEIRTT |
BENZOATEABEILTZ | The sim is unreliable here: it fishes only once and ignores blocking | ALIT | Agrees (ALIT) | Macondo’s simulated future self drops BEZ after most misses, but the real bot re-simulates each turn and kept fishing in all 151 sampled first-miss positions and all 69 second-miss positions |
| FEW (opening) | Undecided | FEW | Agrees (FEW, +1–1.6%) | Not a claimed mistake |
Our checks patch each mechanism inside Macondo, so they test the mechanism rather than the move. Scores weren’t visible in the article’s screenshots; 0–0 is assumed except BENZOATE (-150, inferred).
Complicating the picture is that Macondo plays Matsumoto’s preferred moves on some settings. Macondo not being sufficiently certain that ILK is better is only arguably an error, since on deeper sims it does at least play the move Matsumoto thinks is correct. Macondo only playing Matsumoto’s preferred move of SHAKO(S) on shallow sims is something I’m less certain what to make of.
DU: There are cases where engine-preferred move is worse, but it’s mostly because of how current engines work, doing a Monte Carlo simulation and assuming your opponent will play his top equity play.
On closed boards, macondo sometimes struggles to find the best moves (tho it’s often arguable which of the moves is the best, when you cannot trust the engine), especially when it’s trailing, it tends to assume that opponent will open up a bingo spot, which is very unlikely to happen.
https://woogles.io/game/9uDRKeYKf8?turn=22
For example VITAE here is a clear error to any human player. It’s hard to say what’s best for sure, but this move basically concedes the game. I would strongly prefer something like INTI or NIT (hard to say their real win %, it should be lower than what the analysis says).
The engines give VITAE about 30% win rate, in reality i believe it is 0%, because the only bingos possible to draw are through the AG, and any sane player will simply block the spot (as Mack did).
The endgame and pre-endgame (1 in the bag) are played perfectly by the current engines if they look deep enough. On woogles website the bots sometimes make errors because they are solving the endgame at insufficient depth.
As DU observes, VITAE absolutely does not have a 30% win rate. But DU’s analysis here isn’t quite perfect: VITAE’s win rate isn’t quite zero. Using a uniform weighting33 Not perfectly accurate, of course, but using i.e. Macondo’s inference system to weight Mack’s possible racks doesn’t change that much. over the possible racks Mack might have, there is a particular fixed Mack strategy such that BestBot wins (or ties) at most 1.91% of the time, however BestBot plays, so that’s the tightest upper bound I can give. Most44 According to Claude, roughly 3/4 of the possible 1.91% weighting Mack’s racks uniformly, 2/3 weighting them with Macondo’s rack inference. of BestBot’s winning chances after VITAE are because BestBot actually has a second possible bingo lane, through the blank g in row 14.
Now, all of the possible row 14 bingos require tiles that turned out to be on Mack’s rack (CEGLNOO) — with the tiles that were in the bag, AIILMRR, the only possible bingo is M(AG)ISTRAL, which Mack’s CL(AG) blocked. In fact, VITAE’s win rate is exactly 0% given the rack Mack had in the actual game, supposing Mack plays correctly5. But while BestBot could perhaps be expected to have a decent guess at the contents of Mack’s rack, it doesn’t seem at all reasonable to expect it to infer that row 14 bingos are off the table66 Indeed, BestBot should probably be trying to play to its outs in this sort of position: even if it could infer that Mack probably has a rack where VITAE loses, most other moves don’t seem to do much better, so playing for a row 14 bingo might be the best strategy even if it usually doesn’t work..
The strategy that Mack can follow such that BestBot wins at most 1.91% of the time regardless of what rack Mack has is pretty straightforward: leave BestBot with the fewest winning bingos. For simplicity of analysis, we preferred to play 3+ tiles to hit a full-information endgame, which Macondo can solve exactly; Mack wins nearly all of these. Often Mack has a rack such that BestBot has no possible bingos, so Mack can just play a move that empties the bag and which scores enough that BestBot can’t catch up without a bingo. If BestBot’s only possible bingos given Mack’s rack are in row 1, then Mack blocks row 1 with moves like 1C GAM, REC, ROC, or RIG; 1D GAL(AG)O; or 1E IM(AG)O or RE(AG)INIC. If BestBot’s only bingos given Mack’s rack are in row 14, block in row 14 with a move like 14I A(g)OG.
Mack can’t always do a three-tile play: in the two possible racks with no vowels, Mack can win with 1E CL(AG), as he did in the actual game. There are also a couple other racks that just do slightly better with a two-tile play: the particular strategy Opus 5.5’s code put together does 14H OR(g) with the rack GILLNOR and 1C GI with the rack CGIILLO.
On the other hand, we were actually able to bound BestBot’s winning chance above zero. Again using a uniform weighting over possible racks, BestBot can win after VITAE at least 0.704% of the time. This doesn’t really contradict DU’s claim that VITAE is essentially concession very much: “the win rate is somewhere in [0.704%, 1.91%]” isn’t exactly a cheery situation for BestBot. But the reason I can’t declare this a clean Macondo misplay is that it’s difficult to demonstrate any other play is actually definitively better.
The move which we were able to give the highest floor on the win rate of was DU’s (IN)TI77 Maybe this is because we put more effort into raising the bound on DU’s preferred moves., at 0.79%. This is higher than VITAE’s floor, but lower than VITAE’s ceiling. For what it’s worth, my best guess is that (IN)TI’s win-rate is somewhere around 1.5-4%, but this is somewhat difficult to rigorously show. (IN)TI leaves two more tiles in the bag than VITA(E) does, making it a somewhat more difficult analysis job, and even VITAE we were only able to bound within an interval of size 1.2%.
One thing is for sure: Macondo’s “win rate” percentage is not remotely close to the actual win rate. It can be really quite dramatically far off. So Macondo makes obvious gigantic errors if you’re trying to use it as a win rate estimator. But if you’re just trying to use Macondo to choose the best move, all you really need is that Macondo’s win rate percentage is an increasing function of the actual win rate. Macondo being more screwed than it expected doesn’t necessarily mean in and of itself that some other move beats VITAE.
They actually linked http://www.breakingthegame.net/computers3, but then corrected themselves and said they meant 5.
↩The author of Breaking the Game.
↩Not perfectly accurate, of course, but using i.e. Macondo’s inference system to weight Mack’s possible racks doesn’t change that much.
↩According to Claude, roughly 3/4 of the possible 1.91% weighting Mack’s racks uniformly, 2/3 weighting them with Macondo’s rack inference.
↩I wasn’t able to establish even that BestBot would have a winning strategy if it knew that Mack’s rack was CEGLNOO. Every other (tile) play we checked seemed to be just as lost as VITAE was, including all five in Macondo’s top ten (the other four being exchanges that were too difficult to check) as well as DU’s NIT and INTI. Mack can reply to NIT with M7 COLOGNE (hooking off NIT to form (NIT)E), can bingo L4 NEOLOG(I)C through INTI, and can block 7B CONG(E) against Macondo’s second choice of J4 TI.
AIILMRR just gives BestBot very little to work with. It’d take more time to work through all the exchanges, but they don’t look especially promising.
↩Indeed, BestBot should probably be trying to play to its outs in this sort of position: even if it could infer that Mack probably has a rack where VITAE loses, most other moves don’t seem to do much better, so playing for a row 14 bingo might be the best strategy even if it usually doesn’t work.
↩Maybe this is because we put more effort into raising the bound on DU’s preferred moves.
↩


Some potential issues with your/Claude's AIISTTV analysis:
-"The quiet block 7B CONG(E)" doesn't make sense. CONGE doesn't block anything relevant. There are no bingos to block after J4 TI if Mack has CEGLNOO and BestBot has AISTV. But we can't assume Mack knows BestBot's leave of AISTV. Something which blocks MAGISTRAL, the only remaining bingo from his perspective, looks safer.
-Your process for establishing 1.91% as an upper bound for VITAE's chances looks unsound, because we can't assume Mack knows BestBot kept IST. Maybe against certain distributions over 3-tile rack leaves after VITAE, Mack's optimal strategy would be one that does worse against IST than the fixed one you claim.
I went looking for more examples, mostly among familiar games, and yeah, it wasn't so easy to find plays where macondo makes a clear error. Part of the problem is the lack of a clear definition for "macondo" and "best". There are many settings of macondo. I mainly looked at late-game situations. With 1-6 tiles in the bag, you can run either sim or peg (both with several different flag options!), which give very different answers. Sim's issues have already been discussed. Peg is probably better overall than sim for these positions; it's main issue (besides potential slowness) is pessimism. For each possible draw + opponent rack, peg checks to see if the position is a "guaranteed win" (I think it does consider ties but it's easier to talk as if they don't exist here), that is, that you win no matter what your opponent plays in that situation. So peg shines on bag-emptying plays, but when you don't empty the bag, peg effectively assumes the opponent has implausibly much information.
If "macondo" is chosen to be the Woogles analyzer used for the AIISTTV position, we miss out on some value - that analyzer runs "endgame" with 0 in the bag, "peg" with 1 in the bag, and a 5-ply sim in all other cases. I think it also doesn't do inference.
One of the best examples* I found to point to current macondo's issues is https://woogles.io/game/5Vu68gGWxo?turn=22, but it's not as clear as I would like in various ways. Here, the Woogles analyzer likes (LO)GY, which as far as I can tell never wins against optimal play - this is the problem with not running peg. peg (run on my old, but I think up-to-date enough version of macondo. 2-ply is probably enough here, but I ran 4-ply just to be safe, which was pretty slow, OOM 1 hour) wants to fish EG with (LO)GE or EG(O), which win with exactly one draw: RY, which guarantees an outbingo of TRYSAIL. The chosen play of G(ED) creates a decoy bingo lane on column A while actually going for (LO)YALTIES on row 3. peg doesn't like G(ED) because the opponent can always block (LO)YALTIES - but since G(ED) leaves one tile in the bag, it's unclear to me that they will - maybe the bottom could look like a bigger threat from their view of the bag. I don't know how G(ED) rates. I doubt it wins more than 1/6 of games against decent human players, with a zero or low single-digit win% most plausible against the strongest humans. It may be worse than (LO)GE, and maybe there is another one-tile play that is best.
How to calculate the win percentage in a pre-endgame? To find the Nash Equilibrium, we potentially need to evaluate the whole preceding game, in order to calculate rack frequencies. This seems intractable. Also, in reality, the players probably didn't play the whole game GTO, which raises a problem with this analysis method. We could instead find GTO with the (usually wrong) assumption that both players just drew a fresh seven tiles. I don't think there is a public tool that does this, though I think sscg13 in the Woogles Discord has plausible claims to have a private version of such a tool (applicable to e.g. the position in https://arxiv.org/abs/2509.10471). Non-GTO play can also be attractive - in the AEGILSY position, many opponents would overlook the (LO)YALTIES threat.
In the last few days, César Del Solar announced some big progress for macondo with ML in the Woogles Discord: it seems he has an NN method - which evaluates the board, but doesn't sim - which beats macondo's static evaluator about 57.5% of the time. I think this is not much worse than the performance of BestBot (which I think works similarly to the aforementioned Woogles analyzer) against static evaluator. Previously César has done some ML experiments for macondo, but not with nearly as good results. Others have done ML Scrabble experiments: Chris Street tried some NNs with Elise, maybe OhLookCake on Github also; I don't know much about those efforts.
(I deleted an earlier comment; it wasn't an ideal response since I had only lightly skimmed your post.)
*Links to some of my best other candidates, ordered roughly from most compelling:
https://woogles.io/game/NyNwsMj72E?turn=20
https://woogles.io/game/wsNkGCg5JZ?turn=21
https://woogles.io/game/pSwJxyFFbZ?turn=27
https://woogles.io/game/JKbJZNgVqD?turn=21
https://woogles.io/game/CSMTpCemej?turn=28
https://woogles.io/game/JPeVJhoCJV?turn=21
https://woogles.io/game/4XMFn8qYDz?turn=21