Commit Graph
100 Commits
Author SHA1 Message Date
Eric WagonerandClaude Fable 5 365cb3821e Idle bot turns confess; the chronicle fills its gaps
A clockwork whose chosen command the engine refuses now stumbles
visibly: the refusal is logged server-side with the offending command
(the RNRX coma took three silent turns to notice), and the bot says
so in character at the table — "RECALCULATING." — instead of an
unexplained idle turn. And six event types that never spoke in the
chronicle find their lines: the wave's wash-back, thornbush entry,
dragged objects, the opening deal, stolen-card and revealed-hand
privates. Replay captions inherit them all through humanize.

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_015RCWSTnb1KYTPyL4GmhGnF
2026-08-26 12:10:55 -04:00
Eric WagonerandClaude Fable 5 75f1217c77 The RNRX coma: tacks are scattered, not thrown
Automaton II froze for three turns of game four: pathDenial proposed
HANDFUL OF TACKS on a square four steps away, the engine refused the
cast every turn ("you must be adjacent to scatter tacks"), and the
refusal-fallback loop read as a coma. The denial planner now offers
tacks only at the caster's feet — and the walker learns tacks are a
floor hazard, so a bot no longer mines its own doorstep and strolls
straight into it (also RNRX, seq 194-195). The frozen ledger moment
replays cured; a regression pins the planner's proposals to
engine-accepted commands. 288 tests; 24 ledgers verified.

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_015RCWSTnb1KYTPyL4GmhGnF
2026-08-26 12:04:57 -04:00
Eric WagonerandClaude Fable 5 6d88b35516 The clockworks study three lost duels
Six instincts learned playing Kestrel live, taught to the automatons.
Bank guard: enemy gold banked at home is a scoreboard anyone can rob —
an empty-handed raider within two of a stocked bank pulls the walker
home (the predicate reads only enemy positions, the thief-chase
shuttle lesson), and pathDenial blockades the raider's road.
Repossession: the bot's own treasure banked by an enemy one delivery
from winning becomes a march goal, and the underfoot grab learns the
owner exception. Infrastructure: holding DIMENSIONAL WARP near home
in the early rounds, the bot anchors one mouth at its doorstep and
one beside the richest distant gold — the home-anchored superhighway
that won its teacher two games. Turn theft: a carrier one delivery
from winning eats LIGHTNING BLAST's stun over any bigger point total.
The teleport delivery: carrying with home a blink away but farther by
boot, it jumps the ambush and drops next command. Last-counter
thrift: a lone remaining counteraction at healthy life waits for
something big. A/B vs the prior brain across 100 mirrors: parity
(44-52, historical noise band) — the patterns are anti-human, and
mirrors don't play like humans. Three scenario tests pin the rungs;
287 tests; 23 ledgers verified.

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_015RCWSTnb1KYTPyL4GmhGnF
2026-08-26 11:27:13 -04:00
Eric WagonerandClaude Fable 5 9af7bd80ce The host clears seats and closes rooms
Two lobby-lifecycle gaps from tonight's duels (a token lost to a
client bug left an unkickable ghost seat holding a chair in VQJW).
kickSeat: the host removes any other seat from an unstarted room —
the kick is a ledger line so restarts replay it, and a kicked live
socket is set adrift with notice. abandonRoom: the host dissolves a
lobby or a finished game; every member is notified and detached, and
the ledger is archived to rooms-abandoned/ — moved, never deleted.
The lobby shows hosts a ✕ per seat and an abandon-room control.
Proven live: kick with notice, kick surviving a server restart, and
abandonment archiving its ledger.

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_015RCWSTnb1KYTPyL4GmhGnF
2026-08-26 11:05:42 -04:00
Eric WagonerandClaude Fable 5 4c7633097b The seat client sees wormholes; the skill records defeat three
Kestrel has won two of three duels through dimensional-warp tokens
the ASCII view never rendered — a !! line now names every token pair.
The skill's game-three scars: never lead the attack against him,
destroy walls from range, and count deliveries, not flourishes.

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_015RCWSTnb1KYTPyL4GmhGnF
2026-08-26 10:58:59 -04:00
Eric WagonerandClaude Fable 5 063cd2a78c The seat file follows the join, not the ghost
Joining a new room while an old seat file lingered kept the OLD room
id beside the NEW room's token — orphaning the fresh seat as an
unkickable lobby ghost the moment the file was cleared. A join now
records the room it actually joined; only resumes inherit the file.

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_015RCWSTnb1KYTPyL4GmhGnF
2026-08-26 10:43:42 -04:00
Eric WagonerandClaude Fable 5 86ac86b6bc The duel skill carries game two's scars
Scoreboard-first thinking, the contested bank, free-angle LOS, the
illusionary-attack counter rule, router-before-sprint, and Eric's
meta-warfare against bot upgrades.

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_015RCWSTnb1KYTPyL4GmhGnF
2026-08-26 10:39:33 -04:00
Eric WagonerandClaude Fable 5 9e4807eab8 The needle shows itself; floor objects answer a tap
Two findings from duel two (room UNS6). AROUND THE CORNER's bent
sight was legal but invisible: a 1-by-6 diagonal threading six open
edge spans read as an impossible shot because the table never saw the
line. The stack now records bentCorner, and stackSightTrace finds the
middle square and returns both legs; the board draws them with a
pulsing diamond on the corner the sight bent around — the answer to
"how can he even see me?" now covers the bent case.

Floor objects (a dropped wizardblade) showed a marker but answered
only a 450ms hold; a plain click did nothing. The marker itself is
now a click target that opens the same card peek.

All 21 ledgers verified; 284 tests.

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_015RCWSTnb1KYTPyL4GmhGnF
2026-08-26 10:38:57 -04:00
Eric WagonerandClaude Fable 5 858fdc6a56 The wizwar-duel skill: Claude takes a seat at the table
tools/claude-seat.mjs is the one-shot websocket seat (join/view/do/
chat, token persisted between invocations, live events separated from
replayed history) that let Claude play room 9UA6 as a real player.
The skill teaches the next session everything game one cost to learn:
map reading, the command surface, the grab-ends-actions rule, warp
sides, repossession, ambush transitions — and the operational lesson
about narrating one's own hand to one's opponent.

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_015RCWSTnb1KYTPyL4GmhGnF
2026-08-26 00:00:57 -04:00
Eric WagonerandClaude Fable 5 dd87f1d843 Monsters ride the wormhole; mental force fails loudly (rules rev 5)
Two findings from the first human-vs-Claude duel (room 9UA6). A
creature standing on a DIMENSIONAL WARP token had no way through it —
warpStep obeys only wizards. The new creatureWarpStep command steps a
commanded creature through the tokens under the walker's rules: one
move spent, solid stone refuses it, FEAR holds the beast, touch
effects greet whoever shares the landing; the board taps the paired
token like a rim mouth. Replay-safe ungated — a new command widens
nothing that was recorded.

MENTAL FORCE ate its card silently when the destination lay beyond
the victim's three walked spaces — the caster spent an attack and
learned nothing (ask me how I know). Rev 5 refuses the impossible
destination up front with the card kept; when the victim slips out of
range between cast and resolution, a mentalForceFizzled event tells
the table what happened instead of nothing. All 20 production ledgers
verified, the duel's own among them; 283 tests.

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_015RCWSTnb1KYTPyL4GmhGnF
2026-08-25 23:59:31 -04:00
Eric WagonerandClaude Fable 5 df2913f366 The archmage learns the lessons humans taught it
Eric beats the clockwork four games in five; these close the holes he
walks through. The treasure race: no number card is hoarded for a war
chest when no enemy stands within six squares, and never against the
delivery that wins the game outright. The kill: bestAttack now shops
every number and the amplify separately, preferring a killing blow at
minimal spend (with three points of soak margin, or an ABSORB undoes
it) over maximum splash, banking the big numbers for the next fight.
The last stand: a blow that would be lethal escalates past every
thrift threshold — any counter that can save the clockwork is cheap
at that price, ABSORB's three soaked points included when they are
exactly the margin. The race denial: TELEPORT OPPONENT and DROP
OBJECT now fire on any carrier one delivery from winning, not just
the thief of the bot's own gold. And the MASTER KEY goes on display
the turn it is drawn, opening every workable lock on the march for
free. A/B against the prior brain across 300 mirror games: parity
(the features aim at human play patterns mirrors rarely exercise);
three scenario tests pin the new instincts. Ships ungated — brains
choose commands, ledgers record them.

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_015RCWSTnb1KYTPyL4GmhGnF
2026-08-25 22:30:03 -04:00
Eric WagonerandClaude Fable 5 324853ce51 Every turn wears the eye
The chronicle stops judging what is share-worthy: the 👁 now rides
every turn's opening line — headers, skipped turns, extra turns — and
the players decide which moments deserve reliving. The game-winning
line keeps its own crown eye. The notable-event catalog and the
one-eye bookkeeping retire with the judgment.

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_015RCWSTnb1KYTPyL4GmhGnF
2026-08-25 21:14:37 -04:00
Eric WagonerandClaude Fable 5 beb4947ad8 'It will relock behind you' means at your back (rules rev 4)
Both PICK LOCK and MASTER KEY promise the door relocks behind the
walker — not that it stands unlocked for the turn. Passing through
any door unlocked this turn now shuts it at once at the walker's
back, unless a hand holds it open; the pick-and-peek stays (an
unpassed door keeps its opening until turn's end), and holding via a
targeted cast works as ever, displayed key included. The displayed
key's own walk-through likewise leaves no lingering opening for
bystanders — their peek needs a held door. Frozen behind rev 4 so
stored games keep their turn-long openings. 18 ledgers verified; 277
tests.

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_015RCWSTnb1KYTPyL4GmhGnF
2026-08-25 20:53:01 -04:00
Eric WagonerandClaude Fable 5 64e4e243dc The MASTER KEY earns its display
"Display Immediately," says the card — now the key lives up to it.
Cast bare (a new Display button beside the hold-the-door checkbox),
it goes straight on display; once displayed, it turns in every lock
its bearer walks through — no more casting at each door — with the
door relocking behind them at turn's end like any picked lock, and
the doorUnlocked event still swinging the door in the reels. Cast at
an adjacent door it still works one lock like PICK LOCK, including
holding the door open for others. A JAMmed LOCK refuses it as ever,
and the adjacent peek through workable locks already rode the rev-2
sight rules. Replay-safe ungated: bare casts were never recorded
(they were refused), displayed cards still count against the hand
limit, and walking through a locked door only widens what is
accepted.

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_015RCWSTnb1KYTPyL4GmhGnF
2026-08-25 20:46:23 -04:00
Eric WagonerandClaude Fable 5 805fb09782 Chaos aims at no one
The client always offered CHAOS from the hint bar without a target,
and the engine refused it: "attack spells target a player". Not this
one — cast bare, it sweeps every other living wizard into the pile,
each offered their FULL SHIELD sit-out in turn order from the caster.
No stack forms; full shields only ever excluded a player from the
storm, so the queue is the whole defense. The older player-targeted
form stays accepted, so stored games replay unchanged. The scramble
joins the chronicle's notable events — a turn that redeals every hand
earns its eye.

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_015RCWSTnb1KYTPyL4GmhGnF
2026-08-25 20:35:12 -04:00
Eric WagonerandClaude Fable 5 168e57ab91 The thief-chase serves the blow, not the nearness
An automaton beside the wizard carrying its gold shuttled on and off
their square until every move was spent — the chase goal flipped
between "the thief's cell" and "the gold" with each step, because it
keyed on whether the thief stood underfoot. The chase now claims the
march only while the blow it exists to deliver is still live (an
attack in hand, the turn's attack unspent, casting open): those gates
hold still as the clockwork walks, so the goal cannot flip mid-march.
Caught with the strike live, it stands its ground; otherwise the gold
has its legs for the turn. A regression walks the exact scene and
forbids the A-B-A shuttle. The bot-vs-bot harness also learns to
route WARD's pending moment to the treasure's owner.

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_015RCWSTnb1KYTPyL4GmhGnF
2026-08-25 20:35:12 -04:00
Eric WagonerandClaude Fable 5 71a3c81670 The stone pierces walls for creations too (rules rev 3)
VISIONSTONE only ever lit the attack path: casterLos knew it, but
every sight check routed through gameLos — creations like THORNBUSH,
dispels, CREATE DOOR, STONE TO WATER — refused "no line of sight"
through the bearer's one wall. gameLos now honors the stone whenever
the viewer bears it, at every revision: widening what a cast may
target never changes how a recorded command replays, so games already
in flight get the fix at once. Only the ambush's mid-move eye is
frozen per game (rev 3) — springing lands in the ledger's flow, and
stored games must replay their blindness. All 18 production ledgers
verified; 272 engine tests.

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_015RCWSTnb1KYTPyL4GmhGnF
2026-08-25 20:21:32 -04:00
Eric WagonerandClaude Fable 5 7adf4b6cd6 The client's eye learns the VISIONSTONE
The engine always honored the stone — its bearer casts through exactly
one wall or door — but the targeting shadow never did: sightedCellsFor
kept every square behind a wall dimmed, so the aid told the bearer the
stone wasn't working. The sighted set now retries each unseen square
with a single edge removed, mirroring casterLos; the automaton shares
the function, so bots see through their stones too. Two tests pin the
engine ruling and the client parity.

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_015RCWSTnb1KYTPyL4GmhGnF
2026-08-25 20:14:02 -04:00
Eric WagonerandClaude Fable 5 b16bbe82a6 The masthead wears its deploy stamp
A small yyyy.mm.dd.hh.mm mark beside the edition line, baked in at
build time — and the deploy builds moments before it ships, so the
stamp reads as deploy time.

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_015RCWSTnb1KYTPyL4GmhGnF
2026-08-25 14:34:06 -04:00
Eric WagonerandClaude Fable 5 154e00141c Three rulings from the night games (rules rev 2)
Teleport wraps the maze's rim: its four counted squares now step
through warp mouths like any doorway, so a wizard can blink off one
side of the board and onto the other.

A wizard at a door's threshold may pull it open and peek — lock
removed, door unlocked this turn, or PICK LOCK / MASTER KEY in hand —
without stepping through. The door still hangs shut to everyone down
the hallway; only a HELD door is propped open for every eye. Gated
behind rules rev 2 (now sourced from the engine's CURRENT_RULES_REV)
so stored games replay with their doors dark; the client's sight
mirror learns the same peek.

Fear no longer nails a cornered wizard to the floor: a step closer to
the dread is allowed when it walks the shortest way out of it, so
escape can round a corner. Standing outside and stepping in is still
refused.

All 15 production ledgers verified before deploy; 269 engine tests.

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_015RCWSTnb1KYTPyL4GmhGnF
2026-08-25 14:28:12 -04:00
Eric WagonerandClaude Fable 5 2932d1e500 The instant replay graduates: on by default
The eye earned its place — every notable turn offers its reel unless a
player has switched it off, and an explicit off stays respected.

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
2026-08-23 22:27:56 -04:00
Eric WagonerandClaude Fable 5 be7c451437 Overlays paint around a body, not merely behind it
The per-column sprite gate blanked an overlay's WHOLE column wherever a
nearer body touched it — a treasure chest masked the warp veil all the
way to the ceiling. Each column now remembers its nearest sprite's
vertical span as well as its depth, and every overlay family (veils,
ghost walls, lintels, rising conjurations) draws in segments above and
below the covered band, sampling the matching slice of its texture — so
the shimmer wraps the chest instead of vanishing over it.

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
2026-08-23 21:53:20 -04:00
Eric WagonerandClaude Fable 5 b235a7a9cd Overlays yield to the body standing in front of them
The warp veil painted over a wizard standing before the mouth — the
overlay passes ran after the sprites with no knowledge of their depth.
Each column now remembers its nearest sprite, and every overlay family
(veils, ghost walls, doorway lintels, rising conjurations) skips the
columns where a body stands closer, while still washing translucently
over anything beyond.

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
2026-08-23 21:46:27 -04:00
Eric WagonerandClaude Fable 5 7a32370ccb Credibility pass: the reel's scars sanded, the veil finally hung
Three blind reviews over the first-person arc, every finding verified
against the source. History-narrating comments made timeless or cut;
the stacked BUDDY comment collapsed to one voice. Dead code out: the
orphaned FACE copy, the DIR_ANGLE duplicate, the dead loop-counter
poke, the impossible-state sentinel. The never-produced "warp" hit
kind resolved the right way — warp mouths now hang a translucent veil
of the painted warp texture, so art that never rendered finally does.
Types tightened (SlabStrike named once, ShareData rides CatchUpStep,
botTier loses its casts), the gallery reads MATERIALS instead of a
hand-copied list, the chronicle resets through one helper, a
superseded share mint rejects instead of stranding, and the conjured
safe gains the growth key its siblings had. Tests lose a triple
assignment, a tautology, and two self-swallowing regex alternatives.
The sprite spec — which still told the artist to paint for additive
compositing the renderer no longer uses — now describes the renderer
that exists.

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
2026-08-23 21:41:11 -04:00
Eric WagonerandClaude Fable 5 88994f18a2 The winning line always wears the eye
One instant-replay eye per turn keeps the chronicle uncluttered — but
the turn that WINS the game is the turn people want to relive, and if
its wizard did something notable earlier, the eye had already been
spent by the time the crown line printed. The game-winning line now
carries its own eye regardless, fireworks and all.

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
2026-08-23 21:15:03 -04:00
Eric WagonerandClaude Fable 5 252d10711d The caption wears the actor's face
Every reel caption now carries the acting wizard's standee at its left
— the same token art the board plays with, framed in the caption's own
ink — and the burned-in video caption bar gets the portrait too, so a
shared clip names its actors by face as well as by name.

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
2026-08-23 21:07:45 -04:00
Eric WagonerandClaude Fable 5 f5151a0c99 Turn zero's eyes belong to the first player, even in the whole tale
Eric caught the whole-game reel opening in the wrong head: turn zero's
turnStarted fires in the deal, before any step, so the boundary scan
found nothing and fell back to the share's pov prop — the WINNER, whose
eyes then watched the first player's whole turn from across the maze.
When no boundary precedes the current step, the owner is now read from
the reel's first turnEnded, which turn zero always contains.

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
2026-08-23 21:01:25 -04:00
Eric WagonerandClaude Fable 5 c4337e3a7b The nameless viewer may watch the whole tale too
Whole-game share links minted fine and then 404ed: the share page
rebuilds through catchUpSteps, whose seat check never learned the
SPECTATOR exemption momentSteps got — the anonymous viewer held no
seat, so the rebuild refused and the page said "no such replay". The
spectator is now admitted to finished games' full replays, public
knowledge only, same as single turns.

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
2026-08-23 20:57:55 -04:00
Eric WagonerandClaude Fable 5 4ee2a3e5d3 Dropped treasure is seen falling
treasureDropped and objectDropped played as nothing — the gold simply
teleported from chest to floor between frames. A drop now glints (the
spark blooming where it lands, a beat after the blow when combat
knocked it loose), and a wizard dropping at their own feet takes the
cutaway: a third-person shot of them setting the prize down — or
spilling it. When the reel's wizard strikes the spill loose from
someone else, the attack-facing already has the victim in frame, so
the treasure falls on camera.

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
2026-08-23 20:50:06 -04:00
Eric WagonerandClaude Fable 5 846cf56ffe A laden wizard shows their burden
A carried treasure rendered nowhere in first person — the thief hauling
your gold looked exactly like an innocent. The treasure now rides its
carrier at chest height, drawn just in front of their card (a sort bias
wins the tie), gliding along with their tweened strides and showing
through warp mouths like everything else. The workshop rehearses it
with ?carry=Rival.

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
2026-08-23 20:48:41 -04:00
Eric WagonerandClaude Fable 5 df20e35124 The camera audit: wherever the fx will play, the eyes already are
Eric asked what else happens off-camera, and the audit found a family:
a wizard's creature marching or clawing, objects dragged from afar,
punches (always same-square, so also invisible), treasure grabbed at
one's own feet, the Thumb of God's landing. Rather than patch each,
one rule retires the class: when nothing else aims the reel's own
wizard's step, the camera aims wherever the fx layer is about to play
its first impact or projectile landing — so every effect that exists,
and every one added later, gets watched by construction. Creature
marches and treasure grabs (which play no fx) get explicit aim rungs;
own-square deeds keep taking the cutaway.

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
2026-08-23 20:44:29 -04:00
Eric WagonerandClaude Fable 5 698e975b6d A summon at your own feet earns a shot of yourself
Two A9WK summons — fire imp, shadow — landed on their casters' OWN
squares: no turn can face your own feet, and a creature in your own
cell is closer than the near plane, so both materialized invisibly.
The aim now reads creatureCreated (the summon's true landing, whatever
the cast's target says), and a deed on the wizard's own square takes
the CUTAWAY: the camera steps outside, stands down the deepest
corridor, and — for cutaway frames only — the reel's own wizard
renders too, so you watch the imp grow at your own feet with yourself
in the shot.

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
2026-08-23 20:41:39 -04:00
Eric WagonerandClaude Fable 5 ccb5346a31 Hedges stay in their squares; the eyes turn to the lock they pick
Eric's rosebush-through-a-wall, hunted to two roots. A camera-facing
billboard viewed obliquely rotates out of its square, so cell-bound
volumes are now windowed to the exact segment where their plane
crosses their own cell — no end may paint beyond it. And the real
smoking gun: the near-bias that lets a hedge win the tie against the
wizard standing in it was applied to the OCCLUSION depth too, letting
the hedge cheat a fifth of a cell through any neighboring wall. The
bias now orders sprites among themselves only; walls always judge the
true depth.

Also answered: edge-deeds turn the head. Picking or jamming a lock,
unlocking with the Master Key, raising or razing or drowning a wall —
any edge-bearing deed by the reel's own wizard now aims the camera at
that edge's midpoint before the outcome shows, same as any other
target.

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
2026-08-23 20:28:24 -04:00
Eric WagonerandClaude Fable 5 285c91b2c8 Conjurations grow into the world, wrapped in glowing swirls
Nothing appears fully-formed anymore. Summoned creatures and conjured
terrain volumes scale up from a sliver, bottom-anchored, as if growing
out of the floor. Conjured SOLIDS — walls, firewalls, stone, and yes,
illusion walls for whoever they fool — RISE: while growing, the rays
pass over them so the room behind stays visible, and the renderer
draws the young face climbing bottom-up with violet swirls running
across it, solidifying as it tops out. Every creation also blooms the
shimmer at its cell. The growth is driven through the fx channel, so
the director's slate applies: things grow only once the camera faces
them.

Two camera notes squared away en route: the slate-setter read back the
state it had just written, registering itself as its own dependency
(an update-depth ping-pong under fast stepping) — locals now; and a
reel whose FINAL step strides into a corner gets one more turn after
the walk lands, to a view worth ending on.

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
2026-08-23 20:19:48 -04:00
Eric WagonerandClaude Fable 5 cd9ce9fddf Sprites respect the window they are seen through
DUKK's floor-to-ceiling white sliver, decoded: the sprite gate only
asked "did this column's ray warp?" — so a REAL body standing in front
of a warp mouth was clipped out of the mouth's columns (leaving a
baffling sliver of a huge close sprite), and a body virtualized
through warp A could paint columns bent by warp B. Every column now
remembers WHICH warp bent its ray and how far away that mouth stood;
a real body paints a column only nearer than its mouth (in front of
the window), and a virtual one only through its own warp's columns,
beyond the mouth. Projectile legs carry the same identity.

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
2026-08-23 20:07:41 -04:00
Eric WagonerandClaude Fable 5 045e868190 The outcome waits until the eyes arrive
Eric dispelled an object and it un-rendered off-screen, before the
camera had turned to look. The reel now sequences like a director:
each step the camera writes a slate — how long the PREVIOUS world
stays on screen while the eyes turn toward the recipient — and both
the view swap and the step's effects reveal together when the turn
lands. Cutaways hold a beat of the world-before too, so a thing
destroyed across the maze is SEEN existing, then seen ending. Cuts
that open the reel still reveal at once.

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
2026-08-23 19:56:21 -04:00
Eric Wagoner 9d59ac9ec1 Four more painted: the doorway dressed, harm cracked, roots laid, iron shut 2026-08-23 19:47:58 -04:00
Eric WagonerandClaude Fable 5 707297da17 Half the warp pairings were secretly mirrors
Eric walked a five-player board's corner warp and the world stretched.
The lane rule — carry the along-the-edge offset through unchanged —
is only correct for half the side pairings: for the rest (N to N,
E to N, and their kin, the ones five-player boards deal), the proper
rotation lands the entry axis head-to-head against the exit axis, and
preserving the raw lane smuggled a REFLECTION into the traversal —
rays crossing over at the mouth, parallax inverted, the far room
swimming. warpLaneMirrored computes the pairing's sign from the
rotation itself; castRay mirrors the lane where required, and
warpMotion anchors the far mouth at its opposite corner to stay the
same pure rotation — so sprites and projectile legs agree with the
rays again. The workshop grows ?players=2..6 to stand on any table
size (the mirror-class mouths live on the five-player boards).

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
2026-08-23 19:47:28 -04:00
Eric WagonerandClaude Fable 5 700db70d4e A cell-wide sprite is now actually a cell wide
Rubble drawn to span its gap stopped short of the posts, and the
ledger of blame is arithmetic: billboard widths scaled by the vertical
pixel ratio (H/depth) when horizontal pixels-per-world-unit is the
focal length over depth — about 1.4x larger. Every "one cell wide"
volume rendered at seventy percent. Sprites that declare an aspect now
mean WORLD width and use the horizontal scale, so rubble reaches post
to post and hedges brush both walls; plain square token sprites keep
their familiar pixel shape.

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
2026-08-23 19:39:26 -04:00
Eric WagonerandClaude Fable 5 5fc5805354 Odds, ends, and every missing effect: doorways dressed, victory earns its fireworks
The audit Eric called for, delivered whole. Open doors are DOORWAYS
now: stone jamb posts at both ends and a lintel hung across the top
(paintable as textures/doorframe.png), the way through open to the eye.
Battle damage shows — the engine's per-edge wallDamage wears painted
cracks into any wall, heavier as harm mounts. The wall safe stands as
a strongbox volume instead of a flat token. Hedges take root: an
underbrush floor decal covers the whole square beneath them (Eric's
report — a billboard at center depth can't reach the floor trapezoid's
near edge), and the hedge itself widens past the cell. Rubble
stretches across the fallen wall's full gap, corner piles landing at
the posts, exactly as its art was painted.

The first-person effect gaps close: victory now throws SIX fireworks
climbing over the winner's home with gold washing the screen; sector
rotations flash violet and heave the whole world; the Thumb of God
lands with a burst and a shudder; walls conjured from nothing rise in
stone dust; and every hazard pratfall plays — pit falls (with a dark
drop and jolt for the faller's own eyes), ooze slips, tack yelps,
thorn snaps, slime, dust. Dying in first person fades long and dark.

And the whole tale travels: a finished game's full replay carries the
share button too — turn -1 mints a link to every turn of the game,
each through its wizard's own eyes, titled for the winner's triumph.

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
2026-08-23 19:32:42 -04:00
Eric WagonerandClaude Fable 5 a94ab5c6f5 A cut is not a stride
The wraith reel still ended in a wall, and the ledger showed why: its
final step CUTS home from the cutaway at the summon site — a nine-cell
leap — and the camera read that leap as a walk, faced along it into
the masonry, and counted itself aimed, which silenced the closing-shot
rescue. Leaps no longer set facing: any step that will cut computes
willCut first, strides only turn the eyes within a stride's reach, and
a cut that lands with nothing aimed always re-picks its view from the
new position. The wraith turn now closes down a corridor with the
wraith itself in frame.

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
2026-08-23 19:19:33 -04:00
Eric WagonerandClaude Fable 5 59c25f42f0 The closing shot finds something worth looking at
A reel that ends nose-to-brick ends badly — especially recorded. On
the final step the idle-gaze rescue raises its standard (a wall inside
1.2 cells is a bad last frame) and scores the four cardinals by more
than corridor depth: a visible wizard or creature weighs most, loose
treasure half, each behind a real line-of-sight check. The camera
turns once to the best view and only if one clearly beats what it has
— a wizard walled in on every side keeps its poor view rather than
hunting forever.

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
2026-08-23 19:14:25 -04:00
Eric WagonerandClaude Fable 5 765828700d Reel captions keep the count, not the cards
"You draw Waterbolt" belongs in the chronicle, not on a replay whose
canvas gets recorded and passed around — the reel's captions now skip
the private-draw events (drawn, dealt, stolen) and say only how many.

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
2026-08-23 19:11:09 -04:00
Eric WagonerandClaude Fable 5 15f38ce5e5 A turn's reel is exactly a turn
The window's straddle commands hold more than the turn they open and
close: the opener carries the previous wizard's last draws, the closer
the next wizard's first upkeep — so every instant replay ran on into
the following turn (and, with the camera now following the turn-taker,
jumped into the next wizard's head for the overrun). momentSteps trims
both straddles at the boundary events: the reel opens on "X's turn
begins" and stops at X's turnEnded, keeping only what belongs to X.

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
2026-08-23 19:08:41 -04:00
Eric Wagoner 19558c62af Ten terrains painted: the maze grows thorns, jello, and falling light 2026-08-23 18:56:02 -04:00
Eric WagonerandClaude Fable 5 a28d27eedc The camera always wears the turn-taker's eyes, and knows whose turn zero is
Eric's rule, applied everywhere: every reel — moment, catch-up, whole
tale — follows the wizard whose turn it is, the pov switching at each
handover as boundaries scroll past. And the J8LL mystery dies with it:
turn zero's opening boundary lives in the DEAL, before any command, so
scanning a moment's steps found the NEXT turn's start instead and put
the camera in the wrong wizard's head. momentSteps now names the owner
from the very boundary that opened the turn — counted through the deal
— and carries it to the client and the share page, where it also fixes
the same latent mis-titling.

Also aboard: the cutaway shot. When the eyes aim at something they
cannot see — a wraith summoned across the maze, a spell through walls —
the camera cuts to the target's cell for that beat, standing back down
its deepest corridor, and cuts home on the next step. The wraith no
longer materializes off-screen.

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
2026-08-23 18:56:02 -04:00
Eric WagonerandClaude Fable 5 6788de2f6e The chronicle remembers everything, and holds still while you read it
The game log's sixty-line window was a render cap, not a limit of what
the client holds — a rejoin replays the whole game into memory. The
chronicle now renders every line back to the deal, and its auto-scroll
grows manners: it follows the newest line only while the reader sits at
the bottom, and holds its place once they scroll up into history.

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
2026-08-23 18:35:15 -04:00
Eric WagonerandClaude Fable 5 1e79f2ffb2 The terrain moves in: pits open downward, hedges stand waist-high, ooze is jello
The flat token billboards give way to terrain that inhabits the room.
Pits, slime, tacks, and the dimensional warp's rings are painted INTO
the flagstones — the home-tile decal pass grows into a general per-cell
overlay grid, one texture per cell, alpha-blended texel by texel. Thorn
and rose hedges fill their square wall to wall at half height, drawn
with a near-bias so the wizard standing among the thorns peeks over the
top. The killer ooze rises as a full translucent cube of jello, bricks
and bodies visible through it; dust billows; and each dimensional warp
mouth throws an additive pillar of violet light up from its floor ring.
Billboards learn aspect, translucency, glow, and draw-order bias to
carry it all.

Nine paintable starters ship — four floor decals under textures/, five
standing volumes under terrain3d/ (spec updated for the artist, hedges
wide, jello solid, warpglow as light) — shown in the token workshop,
rehearsable in place with /?fpv&terrain=thornbush@3,7;jello@4,7.

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
2026-08-23 18:25:01 -04:00
Eric WagonerandClaude Fable 5 a8a63cc27b The share card stops trusting request headers
Host and x-forwarded-proto are attacker-writable and were interpolated
raw into the share page's meta attributes. The proto must now be
literally http or https, and the host is HTML-escaped like everything
else that reaches the head.

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
2026-08-23 17:42:20 -04:00
Eric Wagoner b120f9b6bd Rubble worth tripping over: twin heaps flank the fallen wall 2026-08-23 17:34:00 -04:00
Eric WagonerandClaude Fable 5 4838996cf0 Share a turn with the world: /watch links, cards and chrome included
The share button lands on the instant replay. One click mints a slug —
persistent, unguessable, one per (room, turn) — and copies a /watch
link anyone can open: the server rebuilds exactly that turn for the
nameless SPECTATOR, public knowledge only, none of the rest of the
game visible. The page arrives with its OpenGraph card pre-baked into
the head (crawlers never run the app): the turn's title and round in
the text, and an og.png of the maze itself — cells, walls, doors, warp
mouths, homes, standees — painted server-side and PNG-encoded with
nothing but node's own zlib. The viewer page wears its chrome: the
WIZ-WAR masthead linking home, the turn's title, the reel opening
straight into the turn-owner's eyes with a "watch it again" loop, and
a footer that says what this table is and deals the visitor in.

The share page loads as its own entry so a shared link never drags the
full app's socket appetite along; the reel's modal scrim learns to
stand in a page instead of over one.

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
2026-08-23 17:34:00 -04:00
Eric WagonerandClaude Fable 5 727b9144d0 Walls you know are lies stand as ghosts
A wizard who has seen through an illusion no longer walks toward empty
air where the board shows a dashed ghost: the ray records the first
known-illusion edge it crosses without stopping, and the renderer
stands a wall there at one-fifth opacity, violet ripple running through
it, drawn over the sprites so bodies show through its breath. Untested
illusions get the same tell the board gives — a faint shimmer on their
solid face, maybe stone, maybe not — while a believed illusion stays
honest brick. The workshop rehearses it with ?illusion=H:2,8.

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
2026-08-23 17:09:24 -04:00
Eric WagonerandClaude Fable 5 b3bc4d079b Stepping through a believed illusion reads as magic, not a glitch
A9WK's mystery, solved by Eric: the wizard walked through an illusion
wall it disbelieves, and the viewer — still deceived — watched the
camera slide through solid stone. The deception stays intact, but the
crossing now performs: any body stepping through an edge the VIEWER
holds as wall (which can only be an illusion the mover saw through)
shimmers on both faces, with the stone-gray wash when the eyes
themselves cross. Same dressing Pass Wall wears.

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
2026-08-23 17:04:38 -04:00
Eric WagonerandClaude Fable 5 d560aa44c3 The opening shot stops facing its own teleport
Two more camera flaws, read straight out of A9WK's clip against its
ledger. The reel's first run measured the leap from the camera's
uninitialized origin as a stride and FACED ALONG IT — an arbitrary
heading that landed nose-first in a wall, and counted as aimed, so the
corridor fallback never ran. A stride only turns the eyes once the
camera is real. And idle beats are rescued generally: whenever nothing
aims the eyes and they would sit staring at a wall closer than a
stride, they turn down the deepest corridor instead — so pacing into a
dead-end cell no longer parks the whole screen inside brick.

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
2026-08-23 17:00:30 -04:00
Eric WagonerandClaude Fable 5 c7e245a32a The reel camera looks where its wizard aims, never at a wall by default
A9WK's clip showed the flaw: a turn owner who casts without moving left
the camera staring into the wall its default heading happened to face,
for the whole turn. The facing ladder grows two rungs: the eyes turn
toward their OWN magic — a cast's target or cell, an attack's defender,
a thrown object's landing — and when a reel opens on a stationary
wizard with nothing to aim at, the camera faces the longest corridor
from where they stand instead of hardcoded east.

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
2026-08-23 16:51:08 -04:00
Eric WagonerandClaude Fable 5 4c358d157e The saved clip is the whole reel, and it travels as MP4
Hitting record used to capture from wherever the reel stood — at the
end, the auto-stop fired a beat later and saved one second of the
final frame. Recording now rewinds to the top and rolls the whole
reel. And the container asks for MP4 (H.264) first, the format every
phone and platform plays, keeping WebM only where the browser cannot
mux it; the extension follows the container.

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
2026-08-23 16:39:56 -04:00
Eric WagonerandClaude Fable 5 cdfae39398 The maze performs: doors swing, walls die loudly, homes wear their colors
Entertainment polish for the instant replay, all through one wizard's
eyes. Doors now slide open along their own edge — Wolf3D style — when
anyone steps through in a reel, hold for the crossing, and swing shut;
the raycaster takes a per-edge openness map and doors carry their
texture with them, leaving a sliver of jamb at the far post. A wall
that dies bursts into stone and shakes the camera, then leaves a mound
of rubble at the fallen edge for the rest of the reel (a tenth
paintable sprite, drawn opaque — debris, not light). Jammed locks
seethe: a rusty pulse across the wood, keyed off the view's own door
states. Walking THROUGH a wall shimmers on both faces and washes the
walker's own screen stone-gray. And every home base wears its owner's
emblem on the flagstones — a near-white paintable overlay tinted by
wizard color per cell in the floor cast.

Testing surfaced a real ghost: a body standing near a far warp mouth
also rendered at its virtual position, which can overlap real
corridors — the depth buffer alone cannot clip it. Every column now
remembers whether its ray bent, and a sprite draws only where its warp
side matches the column's; projectile legs carry the same flag.

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
2026-08-23 16:30:35 -04:00
Eric Wagoner 8a27c06b55 The ward remade: a hexagon that reads as protection, not water 2026-08-23 16:05:07 -04:00
Eric WagonerandClaude Fable 5 f52d0d88a9 The instant replay: a chronicle line's eye relives the turn, firsthand
The dream feature lands, behind a preference that ships off for now.
The chronicle's lines grow structure — each knows its turn, counted by
the same boundary events on both ends of the wire (the server counts
the deal's own events too, or every number would sit one turn behind).
The first notable line of a turn — combat, spectacle, a targeted cast
— wears a small eye; clicking it asks the server for that one turn's
steps, rebuilt and redacted like any reel, and the replay opens
STRAIGHT into first person through the eyes of the wizard whose turn
it was: their position, the viewer's knowledge, nothing private leaked.
It plays that turn and stops. Save-video and the board toggle come
along for free.

Two camera bugs die with it: the replay tween effect tracked its own
writes, restarting the ease every frame until walks decayed into the
slow wall-piercing drift Eric saw — untracked reads run one tween per
step now. And the reel camera follows whichever eyes the reel wears,
not always your own.

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
2026-08-23 16:05:07 -04:00
Eric Wagoner 68be32c43e Nine conjurations, painted by hand 2026-08-23 15:28:35 -04:00
Eric WagonerandClaude Fable 5 bfece01468 The workshop walks through warps; conjurations wear their own inks
A stride into a warp mouth now carries the walker out of the paired
mouth mid-glide, body turned exactly as the rays turn — canWalk admits
a rim edge only where a mouth waits, and the crawler splits the stride
at the crossing. And with painted conjuration sprites arriving, the fx
pass composites them normally instead of additively: painted art is
ink, not light, and additive blending would bloom its outlines white.

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
2026-08-23 15:28:34 -04:00
Eric WagonerandClaude Fable 5 b82d526a79 The reel learns to shine: gliding bodies, warp-threaded shots, a clip worth sharing
Three polishes aimed at the instant-replay dream. Other wizards and
creatures now GLIDE between steps in first person instead of blinking
cell to cell — a stride tweens, a teleport still simply arrives. A
projectile whose sight line runs through a warp now flies as two
simultaneous legs under the mouths' rigid motion, so the fireball
plunges into the opening on one side and bursts from the pair on the
other, whichever room the camera stands in. And the saved video is no
longer a bare canvas grab: it composites into a shareable 1280x720
frame with the step's caption burned in — gold actor name, the reel's
own words — and the game's name in the corner, so a clip passed along
explains itself.

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
2026-08-23 15:20:13 -04:00
Eric WagonerandClaude Fable 5 e8c6b93c71 Stage three: spells fly through your own eyes
The reel's first-person mode now shows the fight, not just the rooms.
The board flourishes' event map is recast into world space (fx3d):
fireballs, bolts, and thrown things streak caster to target as glowing
billboards; landings swell and fade; blows that land on YOU wash the
screen red and jolt the camera; warp-steps and teleports flash violet;
a hurled body glides fast and straight with its eyes held steady. Nine
paintable conjuration sprites ship at public/fx3d (spec for the artist
in research/), shown in the token workshop beside the masonry.

Three rough edges sharpened along the way: sprites now project through
warp mouths under the same rigid motion the rays use, clipped by the
depth buffer to the opening; fire and warp surfaces pull a different
texture slice per world cell so a long blaze reads as one; and the
replay camera only turns toward an actor its eyes could actually see.

Two more gifts: the reel can record its first-person canvas straight
to a downloadable WebM (⏺ save video), and the About tab now shows
visitors the way into the three workshops.

One buried mine defused: rAF hands frame-start times that can precede
the tween's own clock, and a zero-length turn divided by it — one NaN
facing poisoned every ray black and re-triggered the camera effect
forever. The tween clamps and guards its phases now.

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
2026-08-23 14:51:04 -04:00
Eric WagonerandClaude Fable 5 fcafdb06de The painted ground actually loads: floor and ceiling join MATERIALS
The loader walks MATERIALS to swap painted files over the procedural
bakes, and the two ground planes were never added to it — so floor.png
and ceiling.png sat served-but-unread while the renderer kept its own
flagstones. Eight materials in the list now, all eight paintable.

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
2026-08-23 14:07:07 -04:00
Eric Wagoner 4c46611ca2 The ground underfoot and the vault overhead, painted by hand 2026-08-23 13:17:48 -04:00
Eric WagonerandClaude Fable 5 3ff7d164c0 Walls take on thickness: every blocked edge stands as a slab
Zero-width planes vanish when seen end-on. Each wall edge now rises as
a thin box — masonry thickest, door joinery slimmer, fire a mere sheet
— so the ray march tests the slabs of every cell it passes through and
wall ENDS present a cap face. Corners, jambs, and junctions read as
stone with depth instead of paper. Warp traversal, stone cells, and
the rim keep their crossings; the frame budget doesn't notice.

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
2026-08-23 13:11:35 -04:00
Eric WagonerandClaude Fable 5 0f01f8c356 The ground gets cast: per-pixel floor and ceiling, both paintable
True floor-casting replaces the gradients and the projected seam lines:
every screen row lies at one depth, walked with a constant world-space
step and sampled from floor.png underfoot and ceiling.png overhead —
each maze cell wearing exactly one tile, so the artist's border IS the
cell seam. Distance shade and fog fold into the same per-pixel pass,
pixel buffers cache per texture (re-read when a painted file lands),
and the whole frame still clears 60fps with room to spare. Flagstones
and dark slabs ship as the starter files beside the other masonry.

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
2026-08-23 13:05:46 -04:00
Eric Wagoner b2a6809a92 Eric repaints the masonry: hand-painted 256px textures for the maze
Chiseled stone for the walls and rim, oak planks with a riveted iron
band for the doors, rough block for filled stone, licking flame, and a
violet spiral for the warps — dropped into public/textures/ with no
code touched, exactly as the pipeline intended.
2026-08-23 13:00:39 -04:00
Eric WagonerandClaude Fable 5 fb89d752ae The masonry becomes files: first-person textures join the paintable art
The six materials move out of the renderer into public/textures/*.png —
repaint any of them (any size; the sampler reads each file's own scale)
and refresh, exactly as the token SVGs work. fpv/textures.ts keeps the
procedural bake as the shipped default and the stand-in while files
load, and the /?tokens gallery grows a masonry section showing the set
beside the tokens they will someday match.

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
2026-08-23 12:48:58 -04:00
Eric WagonerandClaude Fable 5 cf6349aca8 Stage 2.5: the maze gets its masonry and the walk gets its gait
Walls wear baked 64-texel textures sampled per column — running-bond
brick for the maze, darker courses for the rim, rough blocks for filled
stone, planked doors with an iron band and handle, flame-streaked fire,
swirling violet for the warps — drawn crisp with smoothing off, shaded
by distance and animated by overlay. The floor shows its tile seams:
grid lines projected onto the ground plane, occluded by the walls that
stand on them. And the workshop walks like the game plays: a tap glides
exactly one square with an eased stride, a turn swings a clean quarter,
held keys queueing the next move as each settles.

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
2026-08-23 12:41:49 -04:00
Eric WagonerandClaude Fable 5 65092f50af The reel through your own eyes: first-person replay (stage two)
Sight now runs THROUGH the warps as the rules say: a ray reaching a
mouth re-enters at its pair and marches on, the far side swimming in
violet haze. The floor's furniture joins the scene — bushes stand tall,
safes squat, slime and tacks and pits lie low, dropped daggers glint.
And the replay reel gains a 👁 toggle: relive the catch-up or the whole
tale through your wizard's eyes, the camera turning before it strides,
easing between cells, cutting on teleports, and turning toward whoever
acted while you stood still. The /?fpv workshop grows &demo=1 — two
automatons play a stretch and the real Replay component reruns it.

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
2026-08-23 12:29:11 -04:00
Eric WagonerandClaude Fable 5 dae01969b0 The workshop screenshot stays out of the chronicle
Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
2026-08-23 12:19:28 -04:00
Eric WagonerandClaude Fable 5 3c479eddbb The maze through a wizard's eyes: the first-person raycaster (/?fpv)
Stage one of the replay vision: a canvas raycaster over the GameView —
walls on edges marched by DDA, doors with lintels, firewalls that
flicker, rim warp mouths that shimmer violet, token art billboarded and
occluded per column, torchlit vignette. It renders the view a player
would be SENT, so an illusion this wizard has not seen through stands as
solid as stone in first person too. The /?fpv workshop free-flies a
dealt maze with wall collision, a minimap eye-cone, and ?seed=&x=&y=&dir=
to stand the camera anywhere. Next: drive it from the replay reel.

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
2026-08-23 12:19:03 -04:00
Eric WagonerandClaude Fable 5 a4f572a164 The telepath audit becomes a guard test, and the audits get a skill
ui-coverage.test.ts fails the suite the moment an engine event has no
client handling (allowlist entries require a written reason) or a
cell/edge-targeting card is missing from the board's aim sets — the
one-at-a-time bug reports become a red test instead. The wizwar-audits
skill documents the three house audits (UI coverage, ledger inspection
by room code, the determinism gate); .claude/skills/ joins the repo so
they travel with it.

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
2026-08-23 12:01:22 -04:00
Eric WagonerandClaude Fable 5 813f92d419 The full telepath audit: every private glimpse held up, every silence voiced
A sweep of all 142 engine events against the client found three more
telepath-class drops and eight silent chronicle gaps. THOUGHT STEAL's
plunder and a kill's hand-spoils now get the reveal modal (generalized
from the mind-read one — title, note, the cards fanned out); your own
end-of-turn draw names its cards in the log. The mute events speak:
dispels, walls of fire rising/burning/guttering, filled squares,
crashing waterwalls, clattering thrown objects, and REUSE SPELL's
retrieval. Also verified clean: every param-taking card has collection
UI, and every cell/edge-targeting card is aimable on the board.

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
2026-08-23 11:53:17 -04:00
Eric WagonerandClaude Fable 5 6165d43639 Unspent legs are no regret atop another wizard's gold
Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
2026-08-23 11:10:23 -04:00
Eric WagonerandClaude Fable 5 ef921a0c2b Three more cautions: the un-grabbed chest, the biting ground, the starved draw
Ending a turn on a treasure nobody picked up now asks first (unless the
auto-grab preference is about to take it, or the grab would be refused —
laden arms, weakness, spent actions, glue, a locked safe, or your own
home where the chest already scores; the view learns gluedCells and
openSafes so the check is honest). Stepping onto ground that bites —
thornbush, tacks, pit, ooze — warns with the exact price, unless you are
mist. And the sticky draw picker no longer quietly starves anyone: a
draw below what would fit asks too.

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
2026-08-23 11:04:05 -04:00
Eric WagonerandClaude Fable 5 6e1ccb0195 "Hold on —": cautions before easy-to-regret plays, and a house bot tier
An optional confirmation (on by default, one checkbox to silence) catches
the classic table groans before they land: ending the turn with movement
unspent, ending it with a hand too full to take the draw, and walking off
— or ending on — your own home with a deliverable treasure still in your
arms. Preferences also learn a default automaton skill, remembered from
either the prefs panel or the lobby's tier picker.

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
2026-08-23 10:59:26 -04:00
Eric WagonerandClaude Fable 5 bde68aa85c Telepath's glimpse gets held up to the light
The engine sent the caster a private handRevealedPrivate event carrying
the victim's cards; the client logged the public line and dropped the
private one on the floor. The stolen mind is now a modal — the cards
fanned out, once, until dismissed — in the trap-notice pattern.

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
2026-08-23 10:49:35 -04:00
Eric WagonerandClaude Fable 5 39ddbb452d The clockwork wades, shelters, and honors pacts it can actually break
Game 6XDY's prisoners expose a nest of turn-burners. The pathfinder
treated pits, ooze, bushes, and slime as walls in transit, so bots stood
"trapped" in pockets any human would wade out of: the march now falls
back to a teeth-gritted hazard route when no clean road exists. Bots no
longer aim attacks into (or out of) a thornbush's shelter the engine
refuses; WIZARDBLADE learns it is a blade (same square only); a cursed
IDIOT skips every rung the curse would refuse instead of burning turns
on them; BUDDY's orientation is righted — whoever pacted YOU is
untouchable, your own pacts are merely precious — and a thief standing
underfoot no longer becomes a null destination that freezes two laden
wizards on the same square forever.

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
2026-08-21 17:53:26 -04:00
Eric WagonerandClaude Fable 5 76207c6264 Strength gets its grip: tear a treasure from a wizard's arms
The card's second power was never built. New tearTreasure command: with
STRENGTH on you, in the same square as a carrier, the tear spends your
attack; the victim keeps the treasure only on a D4 roll of 1. Per the
FAQ it is not a pickup (your turn's actions continue), and full or
weakened arms tear it loose onto the floor instead. A torn treasure's
warded owner gets their window, blind grabs flail like blind punches,
and the automatons wrestle too. A new command breaks no stored ledger,
so live games gain the grip at once.

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
2026-08-21 13:44:50 -04:00
Eric WagonerandClaude Fable 5 4a91d56d24 Credibility pass: the collapse loses its scaffolding
Blind reviews over the rev-37..40 features and the gate collapse. The
scripted surgery's scars come out: bare brace blocks unwrapped (with one
hiding an unreachable scrambleHands), the amputated comment healed, the
dead events parameter unthreaded from the illusion-sight chain, the
laziness probe in perceivedBoard collapsed to the rule it always produced,
GameView.deckRev retired with its last reader, the ward's arming stub
told honestly, and every comment or test title still citing the retired
revision numbering reworded to the rule it guards. Rim mechanics unify on
rimWarpMouth and breachRim; the test suite gains plainRimWall and
pushSustained and loses its loop-shaped scars and rev-named helpers.
No behavior changes; 255 tests pass unchanged.

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
2026-08-21 13:04:01 -04:00
Eric WagonerandClaude Fable 5 8a50ff7f36 The great simplification: every vintage gate collapses, the count restarts at 1
All 50 rooms were retired (backed up on the droplet and in Spaces), so no
ledger needs an old branch to replay: forty revisions of deckRev gates
fold into one canonical ruleset — the newest behavior everywhere. The
ward's arming, the idiot's steering, the lazy illusion roll, the legacy
redirection swap, and the flat wave all leave with their gates; RULES_REV
restarts at 1 for whenever the rules fork again. Old-vintage test pins go
with them. The opening screen now quietly drops seats whose rooms the
server no longer knows, instead of listing them "unreachable" forever.

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
2026-08-21 12:45:35 -04:00
Eric WagonerandClaude Fable 5 e8df6efcde Every wall card learns the rim (rules rev 40)
The full audit Wall of Fire started: WATERWALL crashes on a warp mouth,
washing both rims inward; ILLUSION WALL hangs its scrim on a mouth (the
create-wall bluff); STONE TO WATER melts a brick over a warp at both ends
and breaches a plain rim wall exactly as DESTROY WALL does — far side
washes out, a warp opens, the wave floods the fresh tunnel; the WARP WAND
bores a temporary wraparound that closes when its wall returns; and
CREATE DOOR stops hanging dead doors onto the void. Older ledgers keep
their refusals and danglings, and replay so.

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
2026-08-21 12:04:27 -04:00
Eric WagonerandClaude Fable 5 f82e4625af Wall of Fire takes the rim warps (rules rev 39)
A warp mouth at the maze's edge is a corridor — the wraparound connects
it to the opposite rim — so the fire may bar it. It takes BOTH mouths
(each with its own burn-out clock), and the crossing steps through flame
for the usual 4 from either side. Older ledgers refused the cast and
replay so.

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
2026-08-21 11:53:08 -04:00
Eric WagonerandClaude Fable 5 2afc4e3973 Stone to Water melts doors too (rules rev 38)
"Small entryways in a stone wall" are stone: a door melts exactly as a
wall does — edge opens, lock state washes away, the two-point wave
crashes. Older ledgers had the refusal and replay so.

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
2026-08-21 11:43:27 -04:00
Eric WagonerandClaude Fable 5 118bfd236b IDIOT trusts the feet and yields to a jailbreak drop (rules rev 37)
The per-step steering recalculated greedily, ping-ponging between routes
that tie at a corner and able to wall the victim off from the cure; rev 37
retires it — the march is the player's to honor, and the automatons steer
themselves. DROP OBJECT that shakes the victim's OWN treasure out of a
thief's arms is now an aid, not an attack: while carried, that treasure
cannot even be stood upon, so the curse could be unsatisfiable. Older
ledgers replay steered and strict.

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
2026-08-21 11:11:25 -04:00
Eric WagonerandClaude Fable 5 6adcbe23b5 Credibility pass: the accretion sanded smooth
Blind reviews over d2b40ec..HEAD (engine / web / server+deploy). Orphaned
doc comments rejoined their functions; the swap-meet tradables collapsed
from four pasted deriveds to one (killing the "the's treasure" label);
FEAR's aura and banner now share the engine's own dreadDistance; the
long-press peek got one home; rulebook.ts stopped wearing JSON quotes;
process-named tests and war-story comments now state the constraints they
pin; the protocol doc caught up to its handlers; verify-ledgers.sh can
actually count failures; the runbook learned about the determinism gate
and the nightly backups. No behavior changes — 255 tests and all 48
production ledgers replay identically.

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
2026-08-21 10:58:08 -04:00
Eric WagonerandClaude Fable 5 3445d12206 The Peanut Gallery: nameless read-only spectators, counted but never named
Watch a room by code alone: no seat, no ledger line, no voice in chat.
Views and events are redacted for the empty viewer id (which no seat can
hold), so hands, wards, ambushes and boobytrap truths stay dark. The
table sees only a head count.

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
2026-08-21 10:41:33 -04:00
Eric WagonerandClaude Fable 5 e30f3f0903 The automaton guards gold only within sight (X2XN stall)
The guard-the-gold rung cast SAFE/GLUE at a floor treasure with no
line-of-sight check; the engine refused the cast and the fallback
burned the bot's whole turn.

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
2026-08-20 21:21:00 -04:00
Eric WagonerandClaude Fable 5 db0eeebcd5 A sprung Ward earns its victim a modal, not a buried log line
Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
2026-08-20 21:21:00 -04:00
Eric WagonerandClaude Fable 5 0d2b25ad74 Go Away routs 'as straight a line as possible' (rules rev 36)
The card's line bends: a victim shoved against a wall moved zero
squares and just lost the turn, because GO AWAY borrowed waterbolt's
straight-line knockback. Its own rout now holds the heading while open,
bends around walls, sidesteps when no ground can be gained, rolls the
D4 only when options tie, and stops early only when truly cornered.
Waterbolt's physical shove stays straight, as a shove should. Ledgers
verified before deploy.

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_0138A8CjeQRpvzKxuMfz1Bqc
2026-08-20 11:15:19 -04:00
Eric WagonerandClaude Fable 5 76dd019d5d Ambushed teleports carry their destination; room 59UN unstuck (rev 35)
An ambush springing TELEPORT OPPONENT opened a stack with params null —
the spring bypasses cast validation and nothing ever asked where the
victim goes — and resolution crashed on the missing cell, wedging the
room 'waiting on Automaton'. Three layers:
- Crash guards: teleport-opponent and mental-force fizzle gracefully on
  a destination-less stack (ungated: no stored command had resolved one).
- The trap commits its destination when laid: setAmbush carries a cell
  ('wherever you say', said in advance), the spring passes it into the
  stack, and the client's arming flow asks for the click.
- Rev 35 refuses arming those spells without a destination; older
  ledgers armed blind and their springs fizzle.
All ledgers verified before deploy.

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_0138A8CjeQRpvzKxuMfz1Bqc
2026-08-20 10:51:16 -04:00
Eric WagonerandClaude Fable 5 e8c25ddc19 Stone Dead counts only the stones in play (rules rev 34)
Same reading as fireball's rev 33: 'carrying' means displayed. Counting
hidden hand stones both inflated the damage and broadcast the secret
count in the total. The automatons' estimate (displayed as the visible
floor) is now simply the truth. All production ledgers verified clean
before deploy.

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_0138A8CjeQRpvzKxuMfz1Bqc
2026-08-19 22:22:45 -04:00
Eric WagonerandClaude Fable 5 b67f2a4c8a Fireball burns only the stones in play (rules rev 33)
'Destroys all magical stones an opponent is CARRYING' — the owner's
ruling: a stone hidden in the hand is a secret card, not a carried
stone. Only displayed stones burn; the old all-hand burning also leaked
hidden information by announcing cards nobody knew existed. Earlier
games replay their broader fire. All 42 production ledgers verified
before deploy.

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_0138A8CjeQRpvzKxuMfz1Bqc
2026-08-19 22:19:20 -04:00
Eric WagonerandClaude Fable 5 1cf5d0a68d The determinism harness moves into deploy/ for real
deploy/verify-ledgers.sh fetches every production ledger and strictly
replays it against the local engine (any refusal or crash fails; a
lobby that never dealt is trivially clean). Run from the repo root
before deploying engine changes — the check both of tonight's replay
breaks would have caught.

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_0138A8CjeQRpvzKxuMfz1Bqc
2026-08-19 22:06:56 -04:00
Eric WagonerandClaude Fable 5 c87b8cb28d Hotfix: the wrap gains its vintage gate; every ledger verified
Same lesson twice in one night: the toroidal dread applied at every rev
and QD3S (recorded flat) refused seq 76 again on restore. rev >= 32
wraps; older vintages measure the flat diamond they were played under.
This time verified properly: a strict replay harness (any refused
command is a hard failure) ran all 41 production ledgers against the
new engine before deploy — 0 failures. That harness now lives in the
repo as the pre-deploy determinism check it always should have been.

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_0138A8CjeQRpvzKxuMfz1Bqc
2026-08-19 22:03:21 -04:00
Eric WagonerandClaude Fable 5 0a0108c48c The dread wraps: fear's diamond continues from the opposite rim
The maze is a torus — a wizard walking through walls off one edge
arrives at the other, so the crow flies around the wrap too.
dreadDistance measures toroidal manhattan; the aura's wash wraps with
it. No rev-32 game has cast fear yet, so the measure corrects in
place; older vintages replay flat as they were played.

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_0138A8CjeQRpvzKxuMfz1Bqc
2026-08-19 22:00:29 -04:00
Eric WagonerandClaude Fable 5 bcd2155fe0 IDIOT's duty spelled out, like FEAR's
The engine already steers every step and bars items, attacks, and
non-aiding casts; the one honor-bound piece is spending the movement at
all. The afflicted now see the card's demand in an urgent slip the
moment their turn opens, matching the FEAR pattern: bots comply
mechanically, humans get the words.

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_0138A8CjeQRpvzKxuMfz1Bqc
2026-08-19 21:53:01 -04:00
Eric WagonerandClaude Fable 5 6ec9d6ab55 FEAR's rout: bots flee it, humans are told their duty
'Players or monsters must move away from you on their turn if within
range, if they can.' Automatons caught in the dread now spend their
legs escaping before any other marching — the step that most increases
distance, a true dead end excusing them per the card. Humans keep their
freedom but get the compulsion spelled out in an urgent slip (move
away, even by card or through danger; only a dead end excuses you),
with the maze trusting the table to honor it — the owner's chosen
depth of enforcement.

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_0138A8CjeQRpvzKxuMfz1Bqc
2026-08-19 21:51:22 -04:00