Files
benilla-octo/crates/benilla-formats/tests
gromandClaude Opus 5 b8e8fd4382 A creature-skin record fills its slot only where it holds a path
`Monster1/2/3` exist so `CreatureDisplayInfo`'s skin variation can be dropped in
at spawn, and the record's own filename is the fallback where the display has no
variation for that index. The fallback was unconditional, and the slot does not
always hold a name: the stock models leave whatever the exporter left there.
That matters because a filled `texture` wins over the slot downstream
(`benilla_app::entities::display::skin_for`), so junk in it would mask the
display's real variation for good.

Measured over this chain, separating the two populations by whether the name
reads as a path at all:

  * **26 records in 17 models bake a real `.blp` path** and are the winning copy
    — the Crab, Scorpion, Crocodile, Thunder Lizard and RavenLord mounts, the
    WC2 Death Knight (body, mount and a cape out of `ITEM\ObjectComponents`),
    the Wizard Frog's hat, the Duck wearing a turkey skin, the Goblin rocket
    car, the Worgen Demon Mage reaching for the Felhound's skin, Incubus,
    Crystal Satyr, the alternate and Northrend bear mounts. These have nothing
    else to draw with.
  * **55 more carry unprintable leftovers** — Banshee, every DragonSpawn,
    DruidCat, FrostSabre, Lobstrok, ObsidianDestroyer and the rest — all of them
    in `model.MPQ` and `patch.MPQ` copies that this chain's letter patches
    shadow, so none of them is a copy a read reaches today.

So `monster_skin_name` keeps only what reads as a texture path: printable ASCII,
no control bytes, longer than the extension, ending `.blp`. Every one of the 26
passes it and not one of the leftovers does.

benilla-bourbon (tripleslash/benilla-bourbon, "junk creature-skin records")
drops the fallback outright, on Turtle WoW's `Stag.m2` carrying one junk byte
there. Applied here that removes the skin from all 17 models above — the new
test fails exactly that way, "17 of 17 models with a baked skin path did not get
it" — so this takes the diagnosis and not the patch. The leftovers it names are
real; dropping the whole fallback is what this chain cannot afford.

Tests: a synthetic pair beside the guard for both kinds of name, and a corpus
test gated on `$WOW_DATA` that measures both populations over the winning copies
and asserts a path reaches `texture` while a leftover never does.

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01SgstFWtn1RxEJ5kVrpgYwn
2026-10-26 07:28:31 -06:00
..