Two idle-bot loops cured; visionstone reaches the walls

Game eleven's silent turns, diagnosed from the ledger. Automaton III
proposed DESTROY WALL at a wall its visionstone could see — but the
engine's edge-target casts never honored the stone, despite the
declared policy that it is the bearer's sight wherever sight is asked.
castSightEdge now dissolves one wall for the look, and the three raw
losToEdge gates (create-wall, destroy-wall, attacks on walls) route
through it, gaining visionstone and bent-corner sight alike. Automaton
II cast REMOVE CURSE with no patient and no ailment named; the rung
now writes the full prescription. Refusal-fallback loops read as idle
bots — both replays march again. Ledgers verified.

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_015RCWSTnb1KYTPyL4GmhGnF
This commit is contained in:
Eric Wagoner
2026-08-28 12:58:57 -04:00
co-authored by Claude Fable 5
parent b99c22f14a
commit 7585a5e88d
2 changed files with 24 additions and 6 deletions
+10 -2
View File
@@ -1071,11 +1071,19 @@ function selfCare(view: GameView, style: AutomatonStyle, tier: TierTraits): Comm
}
if (!tier.buffs) return null; // the apprentice's book ends at the stones
// A curse on the clockwork gets scrubbed off.
const cursed = view.sustained.some(
// The engine wants the whole prescription — patient and ailment both —
// or the cast is refused and the fallback reads as an idle bot.
const myCurse = view.sustained.find(
(e) => e.targetId === view.you && e.casterId !== view.you && AFFLICTIONS[e.cardId] != null,
);
const cleanse = inHand(view, "remove-curse");
if (cursed && cleanse) return { type: "cast", instanceId: cleanse.instanceId };
if (myCurse && cleanse) {
return {
type: "cast", instanceId: cleanse.instanceId,
target: { kind: "player", playerId: view.you },
params: { cardId: myCurse.cardId },
};
}
// Three or more wizards: LIFESAVER takes elimination off the table.
const lifesaver = inHand(view, "lifesaver");
if (lifesaver && view.players.length > 2) return { type: "cast", instanceId: lifesaver.instanceId };