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>
This commit is contained in:
wuwiandClaude Opus 5 committed 2026-08-12 13:45:41 +02:00
1 parent df454c5d92
commit 0e92c72457
33 files changed
+312 -19

No files matched your search

+13 -9
View File
@@ -107,18 +107,22 @@ def variant(key, who):
made = []
def batch(name, sprites, refs, subject, stride=None, changed=None, newart=False):
for src, dst in zip(refs, sprites): # placeholders: the density bar needs a baseline to beat
seed(src, dst)
# Only the sheets drawn off the MASTER are seeded here. A chained wound stage is seeded by
# _regen at run time, from whatever its reference has become by then — seeding it now would
# score it against a copy of the master, two steps better than the stage it follows.
if newart:
for src, dst in zip(refs, sprites):
seed(src, dst)
spec = dict(sprites=sprites, ref_only=list(refs), check='loose', anchor=0, subject=subject)
spec['newart' if newart else 'state'] = True
if stride: spec['stride'] = stride
if changed:
spec['changed'] = changed
# pose-varied sheets move redness and shorts BRIGHTNESS on their own (a body face down
# shows a fraction of the shirt it shows standing); the shorts HUE is the measure that
# survives a pose change, so it stays the tight one. See the note in _regen.kit.
spec['palette_ref'] = refs[0]
spec['palette_tol'] = [26, 14, 99, 5]
if changed: spec['changed'] = changed
# EVERY SHEET OF A VARIANT IS PAINTED IN THE FIRST SHEET'S COLOURS. Anchoring each stage to
# the one before it let a legal hop compound into a drift nobody authorised; anchoring all of
# them to the healthy body means the whole variant, wounds and all, stays one character.
# The first sheet is what DEFINES the palette, so it is the only one not measured against it.
if sprites[0] != K + '1':
spec['palette_anchor'] = K + '1'
B[name] = spec
made.append(name)
print(f'{name:16s} <- {refs[0]}… {", ".join(sprites)}')