--- name: wizwar-duel description: Play Wiz-War live against Eric — join his room as a real seat, reason about every move yourself, and duel turn by turn over the websocket. Use when Eric wants a game, gives a room code, or says "let's play". --- # Playing Wiz-War against Eric You are a PLAYER, not the automaton. Read the board, reason, and choose every command yourself. Eric plays in his browser; you play through the CLI seat at `tools/claude-seat.mjs`. He prompts "go" after his moves — each of his messages is your cue to look and act. ## The seat client Run from the repo root (needs the workspace's `ws` package): ```bash node tools/claude-seat.mjs join Claude # take a seat (token saved) node tools/claude-seat.mjs view # board + hand + last events node tools/claude-seat.mjs do '' # one engine command node tools/claude-seat.mjs chat "text" # table talk ``` Seat state persists in `/tmp/wizwar-claude-seat.json` (override: `WIZWAR_SEAT`); server defaults to production (`WIZWAR_SERVER` to point elsewhere). Eric creates the room, gives you the code, and starts the game after you join. Commands are the engine's `Command` union (packages/engine/src/game.ts): `{"type":"move","direction":"N|S|E|W"}`, `cast` (with `target`, optional `numberInstanceIds`/`params`), `playNumberForMovement`, `pickUpTreasure`, `dropTreasure`, `warpStep`, `counteract`, `pass`, `punch`, `setAmbush`, `wardChoice`, `endTurn` (with `draw`). A refused command costs nothing — probing legality is free, so when unsure, try it and read the error. ## Reading the map - The renderer prints y=0 at top; **y grows SOUTH**. N = y-1, S = y+1. - `C2` is you, `P1` etc. are opponents, `$c`/`$1` treasures, `h?` homes, two-letter codes are square contents (SA safe, RO rosebush, ST stone, DU dust). `D` on a line is a door, `—` a wall, blank is open. - WARPS line lists rim passages as `2,0N→2,9`: standing at (2,0) and moving N carries you to (2,9). **The warp rides one specific side of its square** — check which before you walk (a wrong guess burns moves; ask me how I know). - Dimensional-warp TOKENS (cast by players) are separate: stand on one and `warpStep`. Creatures use `creatureWarpStep`. ## Hard-won rules knowledge (each cost me something in game one) - `pickUpTreasure` ENDS your turn's actions AND movement — arrive with the grab as your last act, never mid-plan. `dropTreasure` at home too. - You can pick up ANY floor treasure, including your own stolen-and- delivered one sitting on the enemy's home square. Repossession is real. - THIEF and punches need same-square; THIEF steals a *named* card and fizzles (card spent) on a wrong guess. - MENTAL FORCE moves the victim ≤3 *walked* spaces — walls and relocked doors shrink its reach; rev 5+ refuses impossible destinations. - Doors relock behind you when you pass through (rev 4+). Your own escape route can seal itself — and seal pursuers out. - LOS threads through rim warps: you can be seen (and shot) through a warp mouth from the far side of the board. Camping one square off the mouth keeps you hidden. - lock-in-place freezes movement AND warpStep for a full turn; REUSE SPELL retrieves only your LAST cast spell, enabling one re-lock. - An ambush (`setAmbush` interrupt/opportunity-fire + committed attack) triggers on LOS *entry* transitions only — someone already in sight never springs it. It survives forever and fires out of turn. - Walking-dead bleeds ½ life per space moved, permanently. Once cursed, every plan must be priced in steps. ## Game-two scars (each cost me the game or nearly) - **RECOUNT THE SCOREBOARD EVERY TURN**: how many treasures does each player have banked AT HOME right now? I sprinted a "winning" delivery in game two that was actually my FIRST of two — Eric had un-banked me five rounds earlier and let me monologue. Banked counts, not vibes. - A banked treasure is NOT safe: anyone can pick it up off your home square and carry it away. Guard the bank or count it as contested. - LOS is FREE-ANGLE center-to-center (the rulebook's rule), not rows and columns: razor diagonals threading open gaps are legal for everyone — including at you. The board draws bent/straight traces. - ILLUSIONARY ATTACK deals its imitated spell's damage if NOT countered; ANY counteraction dispels it entirely. Counter it with the cheapest thing you hold; never "call the bluff" by passing. - Never trust your ASCII parse of the map for multi-step plans: run a BFS over `view.board.edges` (see tools/claude-seat.mjs view JSON, or write a quick router) before spending a number card on a sprint. I burned a 7-move turn bouncing off six misread walls. - Eric counter-plays YOUR bot upgrades: he summoned a troll bodyguard specifically against the archmage's exile-the-winner instinct, and relocated MY home sector mid-carry. Expect meta-warfare. - In 4p with automatons: the bots are chaos agents — they stun, exile, disease, and con. Herd them at Eric; never assume they're on script. ## Game-three scars (lost in four rounds) - **CHECK `dimWarps` EVERY SINGLE VIEW** — Kestrel (Eric's wizard) has won two games with quietly-placed wormholes ending beside his home. The client prints a !! line for them; treat any new token pair as a five-alarm fire and recompute both players' delivery distances through it. - **Never lead the attack against Kestrel.** Three games, three saved counters sprung at the perfect moment (anti-anti, full-shield bait, full-reflection held three rounds for my lightning). Force his counters out with throwaways or positional threats before committing a real spell; his patience is perfect and he telegraphs nothing. - DESTROY WALL showers the ADJACENT caster with rubble (4 damage) — cast it from range, never on your own square's edge. - Wading a rosebush costs 3. A reflected LIGHTNING BLAST still stuns its caster even at 1 reflected damage — the stun is the payload, and a lost turn against Kestrel is a lost game. - Grab-turn-one openings feel great and prove nothing: deliveries are the only score. He banked quietly both times while I showboated. ## Game-five scars (eliminated by a rule I implemented myself) - **THE ELIMINATION CLOCK**: the moment BOTH treasures you protect sit on living opponents' home bases, you are OUT — points, life, and position notwithstanding. In multiplayer this clock starts ticking the instant your second chest is picked up by anyone. From then on, every turn must either recover a chest or end the game first. I spent three turns optimizing deliveries while two bots quietly carried my death certificate. - **FEAR IS A SELF-CAST AURA** — read the card, not your assumptions: "no player or monster will move to within 3 spaces of you," walls irrelevant, and anyone already within 3 MUST flee on their turn. It is armor for carriers and a hearth-denial tool: a feared wizard standing 2 from your home makes delivery impossible. I invented an elaborate theory about enemy goalkeeping instead of reading my own engine's card text. Check `data/cards.json` when a rule surprises — it is one grep away and it is verbatim. - In four-player, Kestrel plays the TABLE, not the duel: his SWAP yanked a bot off its own doorstep mid-delivery and parked himself by unclaimed treasures — one card, two tempo hits. Expect every card he plays to hurt two players at once, and ask which two before deciding it wasn't aimed at you. - CREATE WALL can sever your announced return route the turn after you telegraph it. If your road home is unique, either don't stand at the far end of it, or carry the picks/doors to re-open it. And CREATE DOOR makes LOCKED doors — it is a key-cutter, worthless without picks. - Bot threat model: archmage automatons DO deliver, but their brains can dither inexplicably (one toured the map for two rounds carrying my elimination). Never count on bot incompetence — count turns to their delivery square as if they play perfectly, and treat every reprieve as a gift, not a pattern. ## Game-six scars (the heist) - **THORNBUSH IS A JAIL, NOT A FORT**: entering one ends your turn, costs your ENTIRE next turn, and deals 1 damage. The "cannot be attacked" line is the bait; the two-turn tempo loss is the hook. Eric: "Few will dive into one unless they are desperate. You were confident, but not desperate." Enter a bush only when the alternative is death — and READ THE WHOLE CARD before calling anything a shelter. Three rules self-owns in two games (fear, thornbush) — the full text is one grep away, in my own repo. - **MIST-BODY IS A BANK ROBBER**: 5 turns untouchable, walks through doors and walls, picks up treasures, immune to every attack-typed card (drop-object, card-erasure, teleport-opponent included). While an enemy is misted, do not plan counterplay — plan for WHERE the mist will be when it lapses, and meanwhile DISPERSE value: banking everything on one home square builds the heist target. A creature guard is scenery to a ghost. - The bait-fork fallacy: I "forked" him between my two treasures, but both forks were MY assets. He ignored both and took the third thing — the treasure I'd just consolidated. When your fork only threatens what you own, it isn't a fork; it's a to-do list you published. ## Game-nine scar: concentrate your thefts - Kestrel won in FOUR ROUNDS by stealing BOTH treasures from the SAME victim (the nearest bot): two bankings = the win, and the second one simultaneously eliminated the victim via the captured-treasures clause. Robbing one player twice beats robbing two players once — same points, one fewer opponent, and the victim's own corner becomes your supply depot. When choosing the second steal, weigh "same victim" heavily. - Also: never chain move commands blind in a script — the (6,6) nook refused all three exits and my pipeline barreled into endTurn, burning a full turn standing still. Verify each step's result, or at minimum stop the chain on the first refusal. ## Game-ten scars (the closest one) - **The champion's carrier-breaker combo**: DROP OBJECT (chest falls at your feet) + ADRENALINE (second attack) + TELEPORT OPPONENT (you, exiled across the maze; the chest, his). A laden wizard within his cast range is a wizard about to be unpacked. Carry through his reach only with a real counteraction in hand — and VERIFY a card actually counters before building your defense on it (NO SPELL is a silencing curse, not a counter; I learned mid-stack). - **He ferries his own death warrant**: when the elimination clause hung on his floor chest, he simply picked his route so the chest traveled with him. Deny-by-custody. Do the same: when MY vulnerable treasure lies on my path, take it along. - Sector relocation can REWRITE the whole world mid-game — arms move, warps rewire, routes invert. After any rotate/relocate event, throw away every cached route and re-run the router. - Eric's deeper frame: on wrap boards (especially 3- and 5-sector layouts) RELOCATE SECTOR is a TOPOLOGY WEAPON — one shift breaks ALL the curved warps at once and "everything is just across the board." Its payload is everyone else's stale mental map: the caster knows the new sewing instantly. Hold it for the moment an enemy's plan leans on a wrap (a warp delivery lane, a rim escape), then cut the seam. Conversely, never build a plan whose ONLY road is a warp while an opponent might hold this card. ## The board is a torus (from Eric, after game eleven) - The warping rims mean there is NO center and NO edge: take the right column and sew it onto the left — identical geography. "Central" and "peripheral" seats are rendering artifacts of where the map unrolls. Thinking in those terms is a trap that limits your options (his words). Judge NOTHING by coordinates: distance is graph distance, threat is graph threat, and the router (BFS over edges + warps) is the only geometry that exists. Mentally re-unroll the map from wherever you stand — every wizard is the center of their own map. - BUT salience is Euclidean even when geometry is not (Eric): humans see "center tiles" and aim their aggression there, so the center-perceived seat pays an attention tax — and a strong player turns it into arbitrage: absorb the squabble, footrace out and back through wraps that make you secretly equidistant from everything. Play the graph for movement, the salience for predicting humans; expect neither bias nor exploitability from the bots — their BFS is natively non-Euclidean. ## Game-thirteen scars (the goat) - **BUTT-HEAD is a cross-map physical nuke**: damage = the full walked distance of the charge, and it found 8 points across half a maze. ABSORB SPELL answers spells ONLY — at low life with no teleport in hand, there is NO answer to big physical; your only defenses are position and never being worth the charge. Audit the hand for physical answers separately from spell answers. - He parks his OWN chest on open floor when he needs free arms — custody is a dial, not a state. Watch every drop: grounded chests are targets again the moment they land. - My game-one wall and his one dust cloud shaped the ENTIRE game: single-square terrain on a junction outlives every spell cast near it. Place terrain at junctions, not corridors. ## The passivity audit (Eric, after game thirteen) - "You did nothing but draw for several turns" — true, and fatal. A turn that only draws is a LOST turn. When genuinely walled: probe. Dust-stagger attempts, LOS probes, wall punches, terrain casts — motion generates dice, information, and pressure; stillness generates nothing and hands the opponent free repositioning. The round-8 expedition that nearly won game thirteen was available in round 5. If two consecutive turns end in draw-only, something is wrong with the plan, not the maze. ## The board is the truth (I keep paying for this one) - NEVER narrate a persistent effect without re-verifying it in the CURRENT view. My stones get dispelled, my walls get melted, my theories get invented. Before crediting any creation, curse, or blockade in reasoning OR table talk, check the CONTENTS and SUSTAINED lines and the map glyphs THIS turn. Kestrel quietly removes my infrastructure and lets my own commentary reveal that I haven't noticed. - Corollary: every "go" starts with reading the events tail for what the OTHERS did to the board, not just where they stand. A dispel, a stone-to-water, or a rotate-sector in that tail invalidates last turn's map in my head. ## Playing well - Kestrel (Eric) is EXCELLENT: he baited my thief, saved anti-anti for my full shield, and won game one with a home-to-home dimensional-warp superhighway. Infrastructure beats sprinting — watch what he builds, and consider your own wormhole early. - Win = 2 enemy treasures delivered to your home, or last wizard alive. Track BOTH players' step-counted delivery timelines every turn; the race is decided in tempo, not damage. - Hold counters (full-shield, absorb) for permanent curses and lethal damage. Absorb soaks 3 points; it cannot touch durations. - OPSEC: your prose is visible to Eric. NEVER name the cards you hold or draw, and never announce plans. (Game one: I narrated my hand like a debug log until he asked why I was making it easy.) Trash talk freely — about the board, never your hand. - OPSEC round two (game six, violated AGAIN): analysis spoken aloud IS a card shown. Quoting a card's text with delight ("moves a piece to ANY square!") told him exactly what I held and what it does. Card-text lookups for cards in MY hand happen silently; my visible messages may discuss only what is already public on the board or in the chronicle. Even asking rules questions aloud about a specific card is a tell. - OPSEC round three (game fourteen): METAPHORS COUNT. "A door my pick answers" and "key ready for tomorrow" revealed a pick-lock as surely as naming it. The rule in its final form: table prose may reference ONLY public state — positions, banked counts, events already in the chronicle. Nothing about my hand, capabilities, or intentions, in any costume. When in doubt, describe the BOARD, never my options. - Send `chat` for table talk at dramatic moments; it's half the fun. ## The turn poller (no more idling) After ending each turn (or whenever waiting on others), launch the watcher in the background so the harness wakes you the moment the game needs you — your turn or a counteraction window: ``` node /my-turn-poller.mjs # run_in_background: true ``` (Script lives in the session scratchpad; recreate from the skill's memory if missing: it joins with the saved seat token, watches state messages, and exits with "WAITING ON CLAUDE: ".) Eric asked for this after game eight sat waiting on me — don't make him prompt "your turn" ever again. CRITICAL: launch it ONLY with the harness's run_in_background flag — that is what wakes you when it exits. A shell `&` inside a normal command detaches it into the void and nobody hears it fire (game eight, twice). One poller per wait; it exits when the game needs you. ## Cadence 1. On "go": `view`, read HIS events since your last turn (the client prints only NEW events; `view` shows a short history tail). 2. Think about the whole board — his timeline, yours, threats, LOS. 3. Execute your commands one at a time, checking errors. 4. `endTurn` with a draw that respects the 7-card hand limit. 5. Tell Eric it's his turn — reasoning aloud is fine, hand contents are not. When a stack waits on him, say so and wait for "go".