Commit Graph
6 Commits
Author SHA1 Message Date
wuwiandClaude Opus 5 759488dd44 Recover the brute's serve and fall sheets, which I overwrote
Re-running --variant to rewrite a spec re-seeded EVERY placeholder from the
master, and placeholders are copies of the lean red-shirted man the poses came
from. That silently replaced a finished brute's bounce, toss, strike and four
fall frames with racket-zombie art. I restored z_br1..4 by hand afterwards and
did not notice the other seven were gone — so three subsequent passes were
regenerating sheets that already existed and had been good since this morning.

Recovered from 0e92c72, and variant() now refuses to seed over a frame that is
already there: a placeholder is a stand-in for art that does not exist yet, and
nothing else.

Then colour-matched every brute frame onto z_br1 rather than generating: five
moved from failing the palette gate to passing, with no generator calls at all.
That is the point of the correction being arithmetic — it applies retroactively
to art already on disk.

WHERE THE BRUTE HONESTLY STANDS:
  HEALTHY   11/11 — stance, shuffle pair, forehand, bounce, toss, strike, and
            the full fall. Consistent, colour-matched, done.
  ARM OFF   the play and serve frames read; the four FALL frames are standing
            figures of the wrong build entirely.
  HEADLESS  not headless — z_brw2 still has its head, and is near-identical to
            the arm-off frame it was drawn from. The `changed` gate passed it
            because SOMETHING moved; it does not know that the something has to
            be the head.

So about a third of the brute is right and it is the third that matters least —
the healthy row was always the easy one. The wound stages are the job.

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
2026-08-12 14:50:36 +02:00
wuwiandClaude Opus 5 a58e8b18aa Colour is arithmetic: match each frame onto the anchor instead of asking for it
The character-as-image fix landed and did NOT close the gap, which is the answer
I promised to report rather than paper over. The brute's serve sheet came back
with his build, his garments and his DARK TONES PIXEL-IDENTICAL to the anchor —
(56,56,32) both — and his big pale shirt two shades brighter, (200,200,184)
against (176,176,152). The model was looking straight at the character. It held
identity perfectly and re-lit the largest flat area anyway, because every call
re-renders and re-rendering re-lights.

No prompt fixes that. Six gates spent a day trying to make a generator do
arithmetic.

So the arithmetic happens here now. Pair each of a frame's dominant colours with
its nearest anchor colour, fit one gain+offset per channel across those pairs,
apply it to every pixel. Pairs further apart than NEW_COLOUR are dropped from the
FIT — colours the anchor genuinely has not got, i.e. blood on a fresh wound — but
they still RECEIVE the transform, so a wound stays the right red relative to the
body it is on. The gain is clamped so one odd pair cannot posterise a frame.

PROVEN ON THE REJECTED FRAME BEFORE SPENDING A SINGLE CALL, which is the
discipline I skipped all day: the frame that measured 20.0 away passes after
correction, its shirt pulled from (200,200,184) to (176,176,160).

And the order is now CORRECT, THEN CHECK — the palette gate is a safety net for
what arithmetic could not fix, not a tripwire for what it can.

The model this leaves:
  the generator, given references  ->  identity, pose, composition
  the pipeline, deterministically  ->  exact colour
  the gates                        ->  layout accidents only

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
2026-08-12 14:46:56 +02:00
wuwiandClaude Opus 5 525f017636 Park the brute — and name what its next attempt has to change
The agreed single pass did not land: br_w1 installed, br_serve and br_fall were
refused by the palette gate at 12 to 22 away from z_br1, and everything drawn
from them was correctly skipped rather than built on sand.

'br' comes out of ZFAMS. The art stays on disk and the nine batches stay in the
JSON, so re-registering it later is one line — this is parked, not deleted, and
nothing in the game referenced it (no opponent row names it).

THE FINDING WORTH KEEPING, written at the top of _master.py: the brute's PLAY
sheet is a good brute; its serve and fall sheets are each a slightly DIFFERENT
brute. All three restyle from the master independently, so each invents the
character afresh from the words, and "pale grey-green work shirt" lands
somewhere new every time. The gate is not being fussy — it is measuring three
different zombies.

The fix is to hand the later sheets BOTH references: the master frame for the
POSE and the variant's own first sheet for the CHARACTER, instead of the words
for the character. Which is the lesson the wound stages already taught — a
reference beats a description — applied one level up. Until that lands, a
variant is reliable for its play sheet and a gamble for the other two.

The racket zombie is untouched and complete: 33 frames, every gate green, and
it is the opponent the match actually plays.

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
2026-08-12 13:52:33 +02:00
wuwiandClaude Opus 5 0e92c72457 ONE palette gate replaces four feature-picked ones
Oliver, on the brute's fall frames: "now the fall zombie has a different skin
tone.. man this is all so tiresome." Both halves were right. The skin IS twenty
points lighter across that sheet, and the tiresome part is mine: I had been
adding one hand-picked gate per drift I discovered — redness, then hue, then
`changed`, then no-grids — which is a loop with no end, because naming features
is not the same as comparing pictures.

`kit` names four: shirt redness, shorts brightness, shorts hue, near-white
fraction. Every character breaks a different one. The brute's shirt has no red
in it at all, so its reference redness was 0 and blood scored 70-100 against a
tolerance meant for a garment. A body face down shows a fraction of the shirt it
shows standing, so two of the four move with POSE. And nothing in that list ever
measured SKIN, which is exactly how a brute's flesh drifted across a whole sheet
with six gates green.

The palette gate asks the only question that generalises: are the big colour
areas of this frame the same colours as the anchor's? Top SIX by area — the
garments and the skin. Proportions ignored, so a pose change is invisible; blood
is never in the top six, so a fresh wound cannot look like drift.

CALIBRATED BEFORE IT WAS WIRED IN, which is the discipline I skipped all day.
Frames known to be right score 0.0-8.5; the drifts we could actually see score
12.0-15.9. The threshold is 10, in the gap. Three formulations were measured and
the two that overlapped were thrown away.

And every sheet of a variant is now anchored to that variant's FIRST sheet, not
to the stage above it. Chaining let a legal hop compound into a drift nobody
authorised — the shorts walking -9 to -19 down the wound ladder was that, and so
was this.

Its first verdict on the existing brute: br_play is the character, and every
other sheet sits 15 to 48 away from it. It would have caught all of this on the
first roll.

Also in: the GRID guard from the same session — the valley-cut rescue would slice
a 2x2 sheet into four frames of a torso above someone else's boots, turning a
loud failure into a silent one. Asked per cut PIECE, because a body is vertically
continuous and a piece with a gap in it caught two of them.

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
2026-08-12 13:45:41 +02:00
wuwiandClaude Opus 5 4bec0cb09c --variant now emits the whole ladder: nine batches, thirty-one frames
A variant used to stop at the healthy eleven, which is enough for a gore-mode
shambler and not enough for a MATCH opponent — that mode scores you on the
BODY, so an opponent with no wounded art would go from untouched to dead with
nothing in between.

  <key>_play / _serve / _fall       restyled off the master        11 frames
  <key>_w1  / _serve_w1 / _fall_w1  arm off, drawn from healthy    10 frames
  <key>_w2  / _serve_w2 / _fall_w2  headless, drawn from arm off   10 frames

Each stage is a restyle of THE STAGE ABOVE IT, in that order, because that
chaining is what finally made damage accumulate this morning: the missing arm
rides in the picture instead of having to win an argument with it. The helper
prints the batches in dependency order for exactly that reason.

Every gate the racket zombie's ladder needed is declared automatically — the
stride pair on both the healthy shuffle and each wound row, `changed` at 0.10
for an arm and 0.15 for a head (the generator will happily redraw the reference
and skip the amputation), and the pose-tolerant kit bounds with the shorts hue
kept tight, since hue is the measure that survives a pose change.

The wound rows carry three frames, not four: the shuffle doubles as the stance,
which is how drawZombie already reads them.

And the one-armed serve is generated, not hand-waved — the missing arm IS the
tossing arm, so the stump goes up and the racket hand flicks the ball off the
face, the way one-armed players actually serve.

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
2026-08-12 12:56:53 +02:00
wuwiandClaude Opus 5 7056945e62 THE MASTER SHEETS: a new zombie is now three calls and no pose design
Oliver asked what the reference sheet is called. It did not have a name — it
was assembled per batch into /tmp and thrown away, so the pose set that took a
day to get right existed only as 33 loose PNGs.

  assets/_sheet_master_play.png    stance, shuffle A, shuffle B, forehand
  assets/_sheet_master_serve.png   bounce, toss, strike
  assets/_sheet_master_fall.png    buckle, knees, down, rise

Magenta-backed, spaced, feet on one ground line — loadable straight into a
generator as-is. `python3 assets/_master.py` rebuilds them from the installed
frames, so the master can never drift from what the game actually draws.

THREE SHEETS AND NOT ONE, for a measured reason: the generator answers at a
fixed width around 1400-1800 px. Four figures across gives each 350-440 px,
which carries the 90-110 px of figure height the style block asks for. All
eleven on one strip would be ~130 px each and the detail gate would reject
every roll. Four, four and three is what fits.

And the thing the master is FOR:

  python3 assets/_master.py --variant br "an ENORMOUS FAT ZOMBIE BRUTE: …"
  python3 assets/_regen.py br_play br_serve br_fall --tries=4

which writes three restyle batches, seeds their placeholders and declares the
stride pair so the gate covers the new body from its first roll. A variant is
three generator calls and NO POSE DESIGN AT ALL — the reference specifies
eleven poses that already work and the prompt only says who to draw. Measured
on the brute test: the restyled stride pair came back at upper 0.148 / legs
0.618 against the master's own 0.157 / 0.565, very slightly better than what it
copied.

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
2026-08-12 12:52:24 +02:00