main
7
Commits
| Author | SHA1 | Message | Date | |
|---|---|---|---|---|
|
|
ad624d281c |
Her legs finally swap: the face-transplant cycle ships, and the prompt rules are law now
The female run took the whole evening because the model would not draw her
RUNNING: roll after roll came back with the same leg forward in every frame
— amplitude wiggle, no gait ("she never changes her leg... floating while
strobing"). The set that ships is the FACE TRANSPLANT: her old cycle's poses
(which always alternated properly — swaps at positions 2 and 6, 78%/74%,
where a runner's legs actually cross) redrawn with only the friendly face
and open beds changed. The model returned that roll on a painted CHECKERBOARD
— it has no concept of transparency, the word alone summons the pattern —
and the figures were custom-keyed off it: light checker blanket, dark
checker border-flood only (the dark cell is nearly her skirt colour; the
first blanket pass shredded the pleats), verified whole over a light ground.
Oliver gated every strip by eye. The alternatives lost on their own terms:
hex-only prompts obeyed the background but drew her dainty (max 44%, no
swap); the explicit leg-swap clause got alternation but clustered it in the
back half (step-step-skip). His pick: the transplant.
The lesson is in PROJECT.md now, next to the bed flag: NEVER say
"transparent" to the model — name one flat hex — and never freehand
background prose in one-off scripts; import _regen.py's CANVAS block, which
has said it correctly all along. SPRV 123, main.js v246, all 14 run frames
verified 200.
Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
|
||
|
|
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> |
||
|
|
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> |
||
|
|
5c0db0a22e |
The opponent is complete: 3 wound stages x 11 states, and a gate for wounds that never happened
The serve and the fall now exist at every wound stage, so a one-armed opponent still serves and a headless one still goes down, instead of reverting to a whole body to do it. 33 frames, no gaps. THE BALL IS OUT OF THE SERVE SPRITES. Oliver: it was painted into three frames and the game draws the ball itself, so every one of them would have ridden along at the wrong place, the wrong time and in the wrong number. Hands open and empty now, poses unchanged as if a ball were there. THE FOURTH GATE, and the one nothing else could see: "copy this exactly, change ONE thing" loses when the change is a REMOVAL. Taking a head off worked every time — it is dramatic. Taking an ARM off mostly did not: five of seven wound frames came back as the reference faithfully redrawn, 0.02-0.05 of their own silhouette different, and the ladder quietly HEALED the body the score had just maimed. Frame count, background, clipping, detail, kit and stride all pass that sheet. A batch now declares how far it must move from the sheet it was drawn from — a copy scores 0.02-0.05, a real amputation 0.12-0.38, a decapitation 0.27-0.75 — and the whole set now measures 0.18-0.65. AND THE BACKGROUND RULE MOVED TO THE FRONT OF EVERY PROMPT. Six rejections in eleven rolls were "background is not magenta", and the generator was not glitching: it was painting the zombies ON A TENNIS COURT. The chained restyle subjects are long, and the magenta instruction sat behind three hundred words of "keep everything exactly as the reference", where it stopped being honoured. Same sentence, said before anything can bury it. One design consequence kept rather than papered over: the missing arm IS the tossing arm, so a wounded opponent tosses off the racket face the way one-armed players actually do. The wound changes how he plays, which is what slice 3 has been asking for. Known and NOT fixed: the shorts hue drifts from -9 to -19 down the ladder. Each stage is measured against the one before it, so a legal 4-point hop three times over is a 14-point total nobody authorised. The fix is to anchor every stage to the healthy frame with a total budget instead of a per-hop one. Co-Authored-By: Claude Opus 5 <noreply@anthropic.com> |
||
|
|
ef88429887 |
The kit gate learns hue, because a greyscale check cannot see grey turning blue
Oliver: "look at the headless men — the trouser color changed." He was right and every number in kit() said he was not. Brightness sat at 85 against the healthy frame's 89, comfortably inside tolerance, while the shorts' blue-minus-red walked from a warm charcoal -8.7 to a cold +0.2 across the wound stages. All three existing measures are greyscale or red-channel; none of them can see a grey going blue, which is most of what "the colour changed" ever means here. Fourth number: the shorts' hue. It immediately fails the headless men AND finds a second drift in the wounded women that the brightness test had passed. The tolerance default went to four entries deliberately — kit_off zips got/ref/ tol, so a three-long tuple would have SKIPPED the new check rather than failed it. That is the same shape of silent no-op as the read-only floodfill. Also: DAMAGE NOW ACCUMULATES. Stage 2 said only "headless", so the arm torn off at stage 1 came back — in a mode where the score IS the body, taking a point off it made the body look healthier. Stage 2 is now headless AND still one-armed. And the stride rule got its counterweight: "copy it exactly, only the legs change" has a second failure mode where the model copies it exactly INCLUDING the legs and returns the same picture twice (upper 0.017, legs 0.022 — a body sliding along with frozen feet, the very thing being fixed). Both halves are stated now: identical above the hips, obviously different below. Co-Authored-By: Claude Opus 5 <noreply@anthropic.com> |
||
|
|
1c405f045f |
THE STRIDE GATE: a walk cycle is one drawing with the legs moved, and now something checks
Oliver, on the sprites, again: "when people on a tennis court walk or run their legs move... this pattern is almost always failing." It has failed repeatedly because NOTHING IN THE PIPELINE MEASURED IT. Frame count, magenta background, clipped edges and detail density all pass cleanly on two unrelated illustrations of the same character, which is exactly what the generator produces when asked for "the same frame with the other leg forward". Three numbers per declared pair, silhouette only, on the feet-aligned centred overlay drawStatic actually draws: HGT height ratio — off 1.00 means the body grows and shrinks once per step TOP difference ABOVE the hip — near zero for a real pair: same man, same camera LEG difference BELOW it — this is the step Calibrated on the pairs that read (brute wound lurch 1.00/0.000/0.638, shambler 1.00/0.070/0.520) against the ones that do not (TOP 0.47-0.85, or LEG 0.09). Opt-in per batch via `stride: [[i, j]]`, because the player's four-frame RUN sits at TOP 0.23 and is right — a run swings the arms too. `--audit` runs the same gate over the sprites ALREADY INSTALLED and exits non-zero on a failure: a gate that only fires on new rolls says nothing about the art already in the game, which is where this was noticed. Five of the six racket pairs fail it today. And the kit gate, which already existed and was never switched on here: Oliver spotted the headless men's trousers had changed colour. Measured — the headless set's near-white fraction DOUBLES (9.5 -> 19.5) where losing a head only accounts for ~1.3 of that, and the wounded swing drifted the other way (shorts 60.5 against its own stage's 85). palette_ref + a per-batch tolerance now catch all three drifted sets and pass the one that looked right. Fixed while in there, mine from the last commit: the wounded stride stepped off walkT, a wall clock, while the healthy one steps off ground covered — the exact foot-slide this project banned for the heavy bodies. No art regenerated yet: the gate and the audit come first, so a re-roll can be told from a lucky one. Co-Authored-By: Claude Opus 5 <noreply@anthropic.com> |
||
|
|
af30db2ff3 |
Make the regen pipeline check the kit, and fix the swing and toss
Every roll drifts the palette and nothing measured it: a white headband on six frames, pale grey shorts on the toss twice, brick-red shirts and brown shoes on the swing all sailed past --tries. check: "same"/"loose" skips colour_match, and colour_match is a global mean/sd fit far too weak to pull brick-red back to red — a nearest-colour palette lock is worse still, it drags the duller reds into the racket's browns. So _regen.py measures three numbers and a batch opts in with palette_ref: redness (r minus mean(g,b) over saturated warm pixels — brightness alone cannot tell brick-red from red), shorts brightness (charcoal 61 vs the drift's 83), and the near-white fraction that is the shoes and socks (brown drops it to 0.9%, pale shorts push it to 7.9%, correct frames sit at 2.8%). Frames known to be right cluster tightly on all three; every drifted frame fell outside on at least one. It rejected five bad rolls in a row, then passed a good one. The swing also kept re-inheriting its own drift: ref_sheet is built from [lead] + the sprites being replaced, so it was showing the generator the very brick-red frame it was about to overwrite. Copying a canonical frame over the targets first breaks the loop — it passed on the next roll. Swing is now a real backswing and follow-through (silhouettes differ by 1.0, racket low behind vs up over the shoulder), both at full standing height, and the toss and smash wear charcoal shorts again. Co-Authored-By: Claude Opus 5 <noreply@anthropic.com> |