- /target and /assist find units by name like the original, and /follow walks you behind your target
- right click opens clams and lockboxes, and the tooltip promises it
- the freeze thaws clean, poses release instead of sticking, and you drop to neutral standing before it grips
- unit frame art layers over the bars like the original
Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
- ice block freezes the body the frame it lands, before the arm even rises
- the loot message links the item, so the name wears its quality colour
- a looted item drops into the bag that actually took it
- effect models live their authored life, born, held, decayed, and bar fills sit under their borders
Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
- the breath and fatigue bars are in, driven by the server's timers
- combo points show on the target frame, rogue and druid only, per target, and Overpower lights on them
- a stun freezes turning too, and gm fly over water stays in the air
- /sit and the shipped slash commands work, sheathing sounds like the weapon's material, and the bar never holds an outgrown spell rank
Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
- buff durations count down properly: the bar polls the remaining time every frame and a server-sent span reads as real seconds
- ground-targeted spells find the floor: Consecration's and Flamestrike's hovering discs ride the decal projector, and Frost Nova's births ride its expanding ring (the emitter params are per-frame tracks now)
- a spell or action stuck on the cursor lets go on a left click, and a macOS hardware-cursor drift heals itself in-process
- a stealthed weapon fades right: the fade twin's cutout follows the source blend, so an opaque batch never alpha-tests mid-fade
Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
- the spellbook draws the cooldown pie on a spell that's cooling down, and the active form's slot lights its checked ring
- shader variants warm at startup (with a tripwire if one ever compiles live), so a first cast no longer hitches on shader compile
- additive glow stacks clamp the way the original scene does, taming Frost Nova's blown-out mist, and shoulder cards split only at rigidly separable bones
- the login handshake now reads the same under both SRP encodings, and cooldown events no longer race the net step
Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
- ground-targeted spells work end to end: press the button, get the targeting cursor, click the ground, and the cast ships on the wire the way the real client sends it
- a reticle sized to the spell's real radius rides the cursor, and on the click the storm model, falling shards and area sound all land at the point
- character screens: a newly created character comes back selected on the list, and the authored layout scales to small windows instead of clipping the bottom controls off
- blob shadows ride their receiver's clip transform and the raster bias that kept them faint is measured and fixed
Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
- terrain draws per chunk now, and one authority culls everything outside: buildings, billboard cards, particle emitters
- the fps and memory creep on long flights is fixed twice over: material animations only tick what something draws, and far-away art is released by distance (with a 30 s dwell floor so fast cameras don't thrash it)
- the second crash ever reported (a cast racing a despawning unit at flight speed) is fixed, with a regression test that reproduces the exact panic
- every build now prints which commit it is, so a bug report can say exactly what it ran
Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
- The login screen stops paying for a world nobody is in. It had been
streaming and simulating all of Elwynn Forest behind a static image — the
client began life as a terrain viewer and the streamers never had an off
switch. The world now boots when you enter it, aimed at the map your
character is actually on, and logging out releases it. Login frame cost:
p50 18.6 to 10.3 cpu ms, worst paced frame 308 to 20 ms; entering
Stratholme is a covered 1.2 s load.
- More login-screen honesty: the fullscreen glue image was re-uploaded to
the GPU every frame — 22 MB a frame for a still picture — and the
braziers' fire had been invisible since the 25th, simulating perfectly
into a camera that is off, because two booths had computed the same render
layer. Both fixed; the flames are back.
- Indoors got truer: the outdoor world draws only through the portal windows
actually in frame, as the original does; the painted-skybox gate settled
on the reference's real rule — any sky-flagged room the portal flood
reaches; and interior objects — gates, hanging signs, chains — take their
room's baked light, anchored at their box centre instead of an artist
pivot that often sits under the floor.
- Hovering with a tooltip up takes its full fix: a tooltip content change
used to run the whole-UI layout solve twice, and it runs once now, on top
of the morning's fix that made an unchanged tooltip cost nothing at all.
Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
- The keyring is built. Your first key makes the keyring button appear by
the bags, opening the window the original keeps its dungeon keys in — the
server had been sending the keys all along; nothing had ever shown them.
- Keys open their doors now. The client used to cast the open as a bare
spell, which the server rightly refuses; it now sends the item-use the
original sends, carrying which key from which slot. The tooltip plays
along: "Locked" turns the soft green when something you carry opens it,
and a key stops inventing a "Use: Opening" line it never had.
- A building can own the sky: a WMO can name its own painted skybox, and
Stratholme's burning city now draws its near-black-to-red dome instead of
the zone's khaki gradient. The exact rule for when it applies settles in
the next snapshot.
- Signpost tooltips follow the cursor again — the tooltip anchor forks per
object class, corner for doors, cursor for signs — and the Blasted Lands
lightning stops striking the same spot for ever: a placed doodad re-rolls
its animation variation every play-window, like the original.
Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
- Locked doors no longer open on a bare right-click. The client now reads a
lock the way the original does — the free "quick open" every character
carries stops matching keyed doors, so a padlocked door greys the cursor
and refuses unless something you have actually opens it. The same gate
fixes the skinning knife: it only shows for characters who know Skinning.
(Opening a door with its key lands later today.)
- A locked door's tooltip matches the original now: one red "Locked" line,
a single white requirement line, seated in the screen corner instead of
chasing the cursor.
- A door that spawns open sends no state field at all on the wire — the
server omits zero-valued fields and "open" is zero — and the client read
that silence as "unknown" and left the collider solid. Absent now reads as
open. This is the first of two independent defects behind open gates that
still block; the second falls in the next snapshot.
- Indoor creatures and objects fade in already lit by their room, instead of
appearing sun-lit and snapping to interior light the instant the fade ends.
Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
- The UI stopped paying to discover that nothing changed. Layout used to hash
~1,900 frames' worth of inputs every frame just to decide "quiet"; it now
tracks a mutation epoch and answers with one integer compare, and a settled
frame reuses last frame's rendered quads instead of re-rasterizing every
glyph. ~0.9 ms off every idle frame — with a verify mode, forced on across
all 489 UI tests, that re-runs every skipped resolve in full and asserts it
would have produced identical results.
- Across this run of snapshots, the one number everything is graded by: CPU
work per frame at the crowded dungeon spot went from ~29 ms to ~16.5 ms.
- A lighting question got the full treatment and an honest answer. Units
briefly took a different day/night lighting law; it read wrong on screen the
same evening, and a build-by-build hunt a full week back confirmed the
world's look never regressed in the first place — the change is reverted,
nothing about the look changes in this snapshot, and the question stays
parked until the one remaining unknown in the reference client is pinned.
- The character pane's model booth grew a headless eye — a dump of exactly
what it draws, no live session needed — built for that hunt, kept for the
next one.
Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
- Particles, ribbon trails, blob shadows, the selection ring, ground decals,
water foam and the weather all push their quads into one shared vertex
stream now — one buffer, batched draws, indices built per frame in draw
order. ~1,100 emitters at the crowded dungeon spot stopped being ~1,100 mesh
assets the engine reallocated every frame, no material asset is ever mutated
for an effect again, and adjacent draws merge like the original's own batches
(its measured shape: 793 quads in 23 draws). Vertices went camera-relative on
the way — the fix for streaks and flakes vanishing in far zones, where the
raw coordinates get big.
- Hovering an item in your bags cost +14 CPU ms for as long as the tooltip sat
open. The tooltip's refresh loop is faithful 1.12 behaviour (the bag button
re-runs its hover every frame, unthrottled, so a late-arriving item fills in
without a re-hover) — but each rebuild dropped the text measuring cache, so
every frame re-shaped every line. One line keeps the cache: +14 → +0.1 ms,
and the paperdoll, inspect and merchant tooltips stop paying the same tax as
spikes.
- "Which room is this creature in" walks one anchor per model instead of every
lit part — ~13,700 part visits a frame became ~1,700 anchor rows. The
frame-time win was honestly flat (the cost had already moved elsewhere); it
lands for the structure, and the old sweep's repair duties became
event-driven with it.
- The perf probe defends its own window now — always-on-top from the first
tick, occlusion counted on the measurement line — after two long overnight
runs were silently destroyed by the display going to sleep.
Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
- The voidwalker's eye glow vanished whenever the camera rose above eye level.
Three investigations said depth; measuring the depth buffer inside the live
quads said otherwise — the fragments reached the framebuffer every frame, and
the body's own transparent batches painted over them. The real client draws a
model's particles after that model's batches, always. Ours now does: every
effect carries a draw-order rung sized to clear exactly its own model.
- Widened to every effect family after asking "what else does this fix": ribbon
trails (a wisp's streamers wove six batches deep into its own body and
flickered as the head whipped) and 3-D model particles (Cone of Cold's
shards). A census over all 9,691 models found 967 whose own body could paint
over their effects; all take the rung now.
- The skinning lane is ours end to end: every rig's joint matrices live in our
shared GPU buffer, written only when a rig actually moved, and our shader
reads them. The engine's lane rewrote the entire joint buffer every frame and
swept every entity in the world for changed transforms — that machinery now
runs against empty sets. Another 6.7 CPU ms off the worst reported dungeon
spot, which now holds a flat 60 fps with p99 under 19 ms.
- Getting around while developing: Ctrl+Cmd+G lands your character where the
free-fly camera is, and Alt-clicking the world map teleports you there (both
ride the server's own teleport, GM-gated). The frozen-body coordinates the
panel used to copy while flying now follow the camera.
- A stuck main thread now diagnoses itself: a watchdog samples our own stacks
and prints where the time went, and a hung teardown names its last system
instead of hanging the window.
Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
- One text-input law for every field. Login, character create and the delete
dialog each improvised their own tiny keyboard handling — no caret movement,
no selection, no clipboard, and Ctrl/Cmd+V typed a literal "v" into the
password box. All of them now run the same byte-verified edit-box law as
chat: clipboard, select-all, word moves, shift-selection, the real 0.5 s
caret blink. The password box masks what you copy off it, like the original.
- Copy/paste on Linux had two independent causes, one per direction: our window
is Wayland but the clipboard backend spoke X11 only, and a copy relinquished
the X11 selection the moment it returned (an X11 clipboard lives only as long
as its owning connection). Both fixed — Wayland windows get a real Wayland
clipboard, X11 keeps a held handle. AltGr is not Ctrl anymore either, so
Polish and German layouts can type ą, ć and ź in chat instead of triggering
select-all. Compile-checked on Linux; wants a real-session retest.
- The exterior sun keeps its colour. A per-channel clamp saturated the warm
continental sun to pale yellow-white on every sunlit fence, post and doodad;
the clamp now happens once, at the sum, so the fiery orange survives — the
reported Silverpine fence and Blackrock steps match the reference's own
arithmetic.
- A pool has a floor. Undercity's upper slime channels claimed the dry room a
storey below them — 115 yards down still read as submerged. A pool now stops
at its own room's floor; a sweep of every building in the shipped world found
51 such stacked sites across 6 buildings, all closed.
- Ctrl/Cmd+Z hides the whole UI layer for clean screenshots, and instrumented
debug runs open their window in the background instead of stealing focus.
Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
- The social window: friends, ignore and `/who`, in the reference's own two-level
arrangement with its inner tabs and per-row right-click menus. The lists ride the
real wire — guid-keyed with no names, resolved through the name cache, and capped
at 50 friends / 25 ignores because those are the client's own caps — and the
ignore list does its actual job: an ignored speaker's chat is dropped silently, a
whisper additionally tells the sender, and a duel challenge is auto-declined.
Guild ships as a disabled tab, which is what a guildless character sees.
- The escape menu: ESC's last rung finally opens something. The game menu lands at
the reference's own size and ladder, and leaving works — logout and quit with the
server owning the clock (instant at an inn, refused in combat, or the 20-second
countdown), narrated by the real camp/quit dialogs. While the menu holds the
center nothing else opens, and the bag bar greys out under it.
- Items on the action bar act like items. An equipped trinket was a dead button;
the reference's use law is two stages — not equippable means use, equippable and
already worn means use in place — over its exact search order (equipment first,
then the bags, then the backpack, then the keyring; never the bank). What can go
on the bar is now the reference's own two filters, byte-read: an item with an
on-use spell or one you can equip, and no passive spells — and dropping a passive
there speaks the real client's own line, "You can't put a passive ability in the
action bar."
- A quest-starter item opens its quest instead of "The item was not found." The
question goes to the item's own guid, never through item-use — which the server
refuses for every one of the 215 quest-starter items — and refusing the quest
says what the client says, then closes the window.
- For the toolbox: a pixel pick that reports everything under the cursor all the
way back, a lens that says which render phase a draw landed in, and switches that
separate "discarded" from "lost depth" from "never drawn" — built while cornering
a flickering tent, whose fix ships in the next snapshot.
Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
- The main menu bar's two empty recesses fill. The micro menu — the eight arched
buttons: character, spellbook, talents, quest log, socials, world map, main menu,
help — sits in the dark panel between the page arrows and the bags, transcribed
from the reference's own layout: the character button wears your portrait, a button
holds itself down while its panel is up, and the talent button appears at level 10.
The latency meter fills the one slot the bar art leaves transparent for exactly it,
tinted green/yellow/red on the reference's 300/600 ms thresholds and drawn UNDER
the bar art, seen through its window, the way 1.12 actually does it. The socials
and main-menu buttons find their panels one snapshot later; help still waits.
- The UI explains itself on hover: 1.12 ships its detailed two-line tooltips ON — a
FrameXML default, not the opt-in extra it is often remembered as — so the micro
buttons, your own portrait, the XP bar, the five bag buttons and the ping meter
all answer a hover with the reference's own explanations.
- The PvP flag, end to end: crossed swords on the player, target and party frames,
driven by the two descriptor bits the wire actually carries, and `/pvp` speaks —
the yellow toast plus the system chat line, the OFF sentence being the one that
warns the flag lingers for five minutes. It really does linger: turning it off
waits out the server's timer, which looks like a bug and is the reference.
- Quest markers stopped freezing. The grey `!` over a questgiver above your level
goes gold the moment you ding, an NPC re-entering view is asked afresh instead of
wearing a session-old answer, and the marker drops when the questgiver bit goes
off — the re-ask triggers mirror the reference's own set, plus one named addition
(your own level changing).
- Water and heights: swimming downhill no longer bounces between swim and fall ten
times a second — the surface line is a two-sided constraint, so the swimmer
settles with the river instead of being left behind by it. And collision height
is per-unit now, read from the unit's own model: a gnome used to swim with a
third of a yard of water over her head because five depth lines were quoting a
human's number.
- A round of pixel honesty in text and chat: the newest chat line no longer wears a
wider drop shadow than every line above it (shadows move in whole pixels now),
keeps its descenders, and hover boxes stop painting over the chat body. The chat
input's history browse survives programmatic edits, a failed script chunk warns
instead of vanishing, and recall deepens to 64 lines. Idle animation got honest
too: a model's idle is Stand resolved through its own lookup table — never
file order, which had the duel flag bobbing on its spawn clip — and an armed idle
is culled on the box its animation authors, not the bind pose, so the flag stops
vanishing at most camera angles.
Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
- Duels. Challenge another player from their right-click menu, or with `/duel`, and
`/forfeit` to give it up. Both popups are there — the challenge you accept or decline, and
the warning when you leave the field — with the flag countdown between them, and the outcome
printed in chat when someone is knocked out or flees. Read off the reference client's own
duel packets and the three globals it keeps client-side, which is why the challenger reads
"You have requested a duel." even though the server never echoes that back.
- Inspect. Right-click a player and open their paper doll: their nineteen publicly visible
equipment slots with icon, name, quality and a linkable item, and their body standing in
the pane, which follows along if you retarget while the window is open. No stack counts and
no durability — those are not fields another player publishes, which is exactly why the
reference client's inspect doll has never shown them either.
- Water knows where it stops. Swimming used to trigger in the dry tunnel thirty yards under
Stormwind's canal, and in mid-air over Blackrock's lava. A liquid is now the grid the map
file actually stores — one wet flag per cell, and the surface height a bilinear over the
four corners of the cell you are standing in, the same sample the reference client takes —
so the water starts at the bank and its surface sits where your eye puts it. Lava is a
liquid you swim in, an indoor liquid asks the building you are inside, and `/liquid` prints
every surface claiming your feet and where each one came from.
- Creature parts authored to appear only on death — the voidwalker, the banshee, the ooze,
the stone elemental, the infernal — were drawing the whole time: material alpha now bakes
per animation sequence and the unit lane actually evaluates it. The character and inspect
model panes are lit by the reference widget's own single light instead of blowing out white,
the rotate arrows spin while you hold them, and the transparent sort ladder had its sign
backwards, so overhead names draw over water again instead of being painted out by a canal
behind them. Underneath, the protocol writer's 95-verb drawer and its thousand-line spell
module split into per-family files — no behaviour change, just a tree you can find things in.
Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
- Other players walk the world. A watched player's motion between server updates now runs through
the same grounded movement resolve as your own character — same capsule, same colliders, same
step-up and ground election — so they follow terrain every frame instead of every packet, and
stop at a wall instead of walking into it and being snapped back. Their jumps are swept against
the world too, and a standstill jump steered mid-air reports that steer, the one mid-air press
the reference client broadcasts rather than defers.
- The move relay rebuilt: relayed moves ride a per-unit chain on real time, a due move never jumps
ahead of its unit's queue, and SMSG_COMPRESSED_MOVES — the batched carrier the server sends under
load — is decoded rather than skipped. Our own send path now matches the reference client's:
facing streams while moving, Nagle is off so each packet is one write, and the strafe axis nets so
left and right can never ride the same packet.
- NPC and quest text speaks the whole $-macro grammar, carved from the reference bytes — your name,
class and race, the gendered forms, and the server's live world states — and the same
substitution feeds gossip, quest text, the quest log and unit frames. Greetings are a weighted
draw, rolled per NPC per open, and a quest giver with no quest to give is no longer clickable,
where it used to open a dialog holding nothing but a placeholder greeting.
- Spell tooltips finish the reference's line law: cast time and cooldown behind the real passive
gate, the required tool or form, the reagents block, the chance-to-X line, a multi-bit
equipped-item requirement named properly instead of by raw bits, and a buff's dispel class.
- The UI layout engine got a dense, reusable anchor solver, and a change gate that skips the resolve
entirely on frames where no layout input moved — in practice, almost every idle frame. Pets are
named by their pet number rather than a creature-template entry, so the client asks the query the
server can actually answer. And the asset extractor grew a stray-geometry census for tracking
down geometry that renders where it should not.
This snapshot replaces the six dated `sync` commits that stood here before it, whose subjects said
nothing but the date. If you cloned before now: `git fetch && git reset --hard origin/main`.
Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>