Three fail-open classifiers, each reading a field that is not where the
bestiary keeps the answer. Found by generating one creature before
spending the allowance on forty-eight; art/creatures/gryphon-u1.png is a
WINGLESS gryphon, from a spec whose bodyPlan is "winged".
1. anatomyWords() read `species`. Shape lives in `bodyPlan` — that is the
field selecting the hit-location table. 44 of the 100 new creatures are
species "baseline" with bodyPlan quadruped or winged, so every one fell
to the silent branch and asked for no shape at all.
2. isPersonSpec() ended `if (tag) return true` — an unrecognised role tag
means person. MONSTER_TAGS listed three tags; the bestiary uses twelve,
so 43 creatures were prompted as "portrait of X, waist-up portrait".
Now bodyPlan decides first, structurally, because a tag list is free
text that grows and bodyPlan is enforced by the engine.
3. ROLE_CLASS knew the same three tags, so HERALDRY fell through to
"carries nothing manufactured and armour >= 4 -> anomalous". Six
centuries of carved stone were classed as far-side machinery, and the
armour clause duly asked for a mech. ROLE_CLASS now carries all twelve,
and the heavy-armour wording follows era: machinery for future and
anomalous, "hide and scale thick as carved stone" for the rest.
Also in this commit: all 100 creatures re-pointed onto the natural attacks
added in 3feac39 — 41 of 100 changed, the rest keeping grasp or punch
because that is genuinely what they do. Three manoeuvres stay as prose and
say so explicitly: dun_cow's and bull_azure's charge, gryphon's stoop and
drop, tup's blind side. Portraits redrawn, since era decides their hue.
All 23 guards pass.
Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
Sixty of the seventy-six actors had no portrait. The sixteen that did are the
hand-made duty roster; the whole bestiary and every scenario NPC fell back to a
generic silhouette.
The point is not that this is free. A portrait composed from anatomy.mjs cannot
contradict the statblock, because it is drawn from the numbers the hit-location roll
uses: silhouette from BODY_ART, height from SIZ, build from STR against SIZ, plating
from naturalArmour, a mark for the primary weapon's class. A Cadence would get five
bodies because its table has five. Nothing has to be kept in step.
Colour carries what a GM wants off a thumbnail — whether the thing is a person,
folklore, recovered machinery, or the far side. That reads the shouted category the
role lines already carry (FOLKLORE, HORROR, FORWARD), which nothing was using, and
falls back to structure for the ones with no tag.
build-packs resolves portraits by stem and extension rather than an exact .webp
filename, so a creature gains art without an edit to content.mjs and a hand-made
raster always beats the generated diagram. A spec that NAMES a portrait and has none
is still a hard build failure.
These read as diagrammatic field-guide plates and will not match the Midjourney agent
portraits. That split is deliberate: the agents are the cast, the bestiary is case
material.
Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>