Files
wizwar6e/.claude/skills/wizwar-duel/SKILL.md
T
Eric WagonerandClaude Fable 5 db3b14fd51 The duel skill records the carrier-breaker combo
Game ten went the distance: the champion unpacked my winning carry
with drop-object + adrenaline + teleport-exile, ferried his own
clause-vulnerable chest beside him rather than leave it stealable,
and banked at ten life through a point-blank fireball. Scars: verify
a card counters before trusting it (NO SPELL is a curse, not a
counter), carry through his reach only with real counteractions, and
re-route everything after a sector relocation rewrites the world.

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_015RCWSTnb1KYTPyL4GmhGnF
2026-08-28 12:00:19 -04:00

268 lines
14 KiB
Markdown

---
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 <ROOM> Claude # take a seat (token saved)
node tools/claude-seat.mjs view # board + hand + last events
node tools/claude-seat.mjs do '<command json>' # 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.
## 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.
- 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 <scratchpad>/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: <reason>".) 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".