The evaluation function and search design for two-player Slay, and three theses that generalize past it: the cut/join graph duality, realizable-treasury (use-it-or-lose-it), and eval-beats-depth in wide-branching games.
Links: The Multiplayer Coalition Problem (the N≥3 wall; this page is the tractable 1v1 base case), Slay, Slay-C, Gaming, Economics
Two-player Slay is a zero-sum perfect-information game, so minimax = MaxN = Paranoid — they all collapse into the plain iterative-deepening alpha-beta already in slay-c/search. The Paranoid-vs-MaxN debate is an N-player argument (worked out in the coalition page); it doesn’t bear on where the project is. The transferable, engine-independent parts are evaluation and search/pruning, and they carry forward to the N-player game unchanged.
One framing upgrade even at 1v1: score relative (V_me − V_opp), not absolute. In a zero-sum cut game that makes “a cut I can inflict on them” score symmetrically with “a cut they can inflict on me” — which the articulation-point term below depends on.
A widely-circulated starter formula is V = w₁·Hexes + w₂·NetIncome − w₃·CutVuln − w₄·TreeTax. The instincts are right but it regresses the existing slay-c GreedyAI eval (which already had unit strength) and double-counts. The corrected term set:
Hexes and the positive half of NetIncome are collinear — you fight the tuner. The independent signal is the upkeep/sustainability side; score that as the drag, don’t pay for hexes twice.max_defense(border hex) − max_attacker(enemy adjacent), per contested border. Unit level is wildly non-linear (a Baron/L4 is near-unkillable). This is the term the starter formula drops and the one least worth losing.TreeTax weight — same effect, one fewer knob. With look-ahead this matters: uncontrolled tree spread loses games, and effective-income makes the search see the spreading drag before it compounds.Slay’s late game is a contest of who cuts long borders more effectively; cheap cut/join capacity is what keeps peasants valuable into the endgame. The key structural insight: cut vulnerability and join potential are one graph structure read from two directions.
Because fragmented territories can’t afford knights/barons and eventually all must be joined, the eval needs a connectivity-distance term: how many captures until my fragments become one economy that crosses the next unit-tier threshold. Two consequences for the cut term specifically — it must be consequence-weighted (a split strands the treasury-poor side, whose units die at next upkeep; weight by army/economy orphaned, and by which side keeps the capital) and reachability-gated (an articulation point only counts if an enemy has an adjacent unit of level > its defense this turn — a cut nobody can execute is free).
This also resolves the decomposition tension in the search section: decompose for move generation, evaluate globally. Peasants-in-the-endgame falls straight out — a peasant is the cheapest tool that both severs a 1-defense neck and bridges a gap, so the cut-delta term is what makes an AI value them late instead of dismissing them.
Banked gold looks like a pure positive; it isn’t. Treasury is dry powder — valuable for flexibility and survival, but earning nothing and deniable. This is the Slay instance of the Monopoly insight from the coalition page: cash is intercept, not slope — it earns nothing until converted to position. Slay adds a twist: the gold is not merely idle, it’s capturable/forceable.
So the term is realizable treasury = gold discounted by the probability it’s denied or force-spent before conversion. Gold on a secure capital = full value; gold on a threatened capital = discounted; gold beyond a survival buffer that’s just being sat on = mildly penalized, because holding un-protectable, un-converted gold is dominated by spending it (a unit, an extension, a tree-clear). This is why “hit a town just to empty the treasury” is a real objective: you’re attacking their unrealized value — the cheapest thing on the board to destroy — and it ties treasury straight back into the cut term (a cut that orphans the treasury-poor side, or a threat forcing premature spend, is the same attack on realizability).
Slay’s turn = {move each unit} × {merges} × {purchases} × {placements} — a branching factor closer to Go than chess. In a wide game each ply multiplies by a huge factor, so reachable depth is shallow, and a smart eval that already sees cut-delta, connectivity, and realizable-treasury crushes a deep search running a dumb hex-counter.
The principle: a good eval is search compression — you pay eval cost once to avoid the exponential depth cost of discovering the same fact tactically. In a narrow game (chess) depth is cheap enough that a weak eval gets rescued by search; in a wide game it can’t, so eval dominates. That’s exactly the early-NNUE lesson.
The handcrafted terms are not throwaway — they are the input features of the eventual learned eval. Frontier-margin, articulation-consequence, connectivity-distance, realizable-treasury, tree-spread-lookahead: hand-craft them now (they also run the Phase-2 bottleneck test below), and they survive into the Stockfish-template Phase 3 as the NNUE’s features. This is feature engineering the learned weights refine, not scaffolding to tear down.
The coalition page’s Phase-2 test: give the AI unbounded depth on a small board and see if it plays perfectly. Perfect ⇒ the bottleneck is search (the pruning/transposition work pays off). Imperfect ⇒ it’s eval (the term surgery pays off). This tells you which half to invest in before touching a single weight — and thesis 3 predicts eval.