Persona poses round 1: 14 expression sheets, crop and matte scripts, records, README results

Sheets for libby, heimdall, kiko, aqua, nibu, eureka (r1a prompt-only and r1b canon-bust reference),
weksa-r1a and void-r1b. weksa-r1b and void-r1a were not rendered (server errors, request allowance spent).
2k originals and full-size cutouts stay out of git.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
This commit is contained in:
Meta Vens 2026-10-14 03:27:46 +02:00
commit 83e92c9bf7
36 changed files with 1675 additions and 0 deletions

1
persona-poses/.gitignore vendored Normal file
View file

@ -0,0 +1 @@
__pycache__/

75
persona-poses/README.md Normal file
View file

@ -0,0 +1,75 @@
# Persona poses
Expression sheets for the eight cast members, cropped into pose cutouts. Canon for the look is the chosen Flux bust
of each character (`cast-portraits` r2a/r3a/r4a), the pixel sheets, the Aqua icon and the Eureka mascot.
## Round 1
`r1/contact-r1.webp` shows all sheets that exist, cropped and keyed on a grey checker (row pairs: r1a then r1b).
Per character: `r1/<name>/<name>-r1a|r1b.txt` is the render record (hypothesis, variable, request id, cost, exact prompt)
and `.webp` is the labelled 12-cell contact image. 2k sheets and full-size cutouts are in
`F:\Projects\cast-art-originals\poses-r1\<name>\` (not in git). `r1/run-log-r1.txt` is the key-free request log.
Each sheet is one FLUX 3 Image render (`aspect_ratio 4:3`, `resolution 2k`, output 2368x1776), a 4x3 grid of busts on flat
chroma green. Cells in reading order: neutral, happy, amused, thinking, concerned, annoyed, surprised, determined, then the
character's four signatures. The prompt is the busts' batch-A style block adapted for a sheet, one sheet sentence, the
character's canon block copied verbatim from its bust record, then twelve cell sentences.
- **r1a hypothesis:** a sheet keeps the character consistent across twelve cells from the prompt alone.
- **r1b hypothesis:** adding the canon bust as a reference holds canon details the prompt alone drifts on, without pulling
every cell into the bust's pose.
- **Variable (r1b against r1a, one per character):** the canon bust cutout on its chroma green is passed as `images` and
cited as image 1 by one prepended clause. Nothing else differs (`r1/check_r1.py` proves it).
Scripts: `r1/render_r1.py` (renders), `r1/matte_crop_r1.py` (crop and matte; the matte rule is `matte_r2.py`'s, unchanged),
`r1/check_r1.py` (record, count, matte and key checks).
### Results
14 of the 16 sheets exist. `weksa-r1b` and `void-r1a` hit server-side HTTP 500 failures and were not re-submitted: the
request allowance (16 plus two transport retries) was spent. Reading the table: "canon" means the bust in
`cast-portraits/r3/contact-final.png`. Labels below are the declared cell labels; where a cell's drawn expression does not
match its label that is stated.
| Sheet | Observation | Agent verdict | Operator verdict |
|---|---|---|---|
| libby-r1a | Held: violet braid over the right shoulder, bone clip, gold earrings, black robe with gold and mauve trim, violet brooch, book hugged. Drifted: the diamond ribbon moved from the clip to a bow at the collar; glasses are a thicker black than canon's thin frame. Cell 3 (amused) is an open smile with a fist at the mouth; cells 6 and 7 are swapped (annoyed shows an O mouth, surprised shows a worried frown). Cell 11 (shush) has no finger at the lips (open book only). The book is hugged in every cell. Expressions differ clearly in cells 1 to 5, less after. Matte clean; divider lines found and trimmed. | Usable for neutral, happy, thinking, concerned, stamp, schema; labels 6, 7, 8, 11 unreliable. | |
| libby-r1b | Canon held better: thin glasses, the ribbon beside the clip, brooch, braid. Label order drifted: cell 4 (thinking) is a plain neutral; the chin-hand pose is at cells 5 and 6; cell 7 (surprised) is a flat frown; the O-mouth faces sit at cells 8, 9 and 10. Cell 11 (shush) is a smirk with a scroll, no finger; cell 12 (schema) holds the diagram and raises a finger. Book hugged in every cell, so the bust's pose pulls the core cells. Matte clean. | Better canon, worse label fidelity than r1a; usable only by picking cells by look, not by label. | |
| heimdall-r1a | Held: dark brown skin, gold eyes, frown, gold earring, black coat with blue cape and gold filigree, key clasp. Drifted: hair has orange streaks instead of the bust's gold ovals; the shoulder armour with blue gems is plain; the raised golden key of the bust is absent from the core cells. Core labels hold in order (grin, wink, chin hand, O mouth). Concerned, annoyed and determined are near-identical frowns. Signatures: badge shows the key, not a badge (miss); barrier strong; protect (cape sweep) good; revoke (two keys crossed) good. Divider lines found and trimmed. | Good. Core cells 5, 6, 8 barely differ; badge missed. | |
| heimdall-r1b | Closest to the bust: gold oval hair highlights, armour with blue gems, earring, key raised beside the shoulder. The bust's key stays in the hand in 6 of 12 cells including core ones. Label order drifted by one: cell 4 (thinking) is a smirk, the chin-hand pose is at cell 5. Cell 9 (badge) is a gold badge with an O mouth, good; cells 10 and 11 are both a hand-and-cyan-shield (no cape protect); cell 12 (revoke) is the key with a drawn X beside it. Matte clean. | Best canon fidelity of the pair; label order and prop leak are the cost. | |
| kiko-r1a | Held: tall white ears with pink insides, kitsune mask on the head, bells and tassels, black kimono with magenta and teal trim, pink-tipped tail. Drifted: no pink headband, eyes read brighter blue than cyan, mask sits over one ear. A fist stays raised near the chest in cells 1 to 8. Cell 3 (amused) is a gritted-teeth grimace, a miss; the rest of the core differ readably. Signatures are the strongest set here: tinker (gadget, tongue out), confetti, sprint (arms out, speed lines), debug (magnifier, wink). Cutout dropped to the nominal grid (5 column runs); crop looks correct. | Good. | |
| kiko-r1b | Matches the bust: pink headband, black ornaments with gold bells and magenta tassels on both sides, pink-tipped tail, mask. The core cells share one torso and pose, so the expressions carry everything and several are close (cells 3 and 4 are both soft smiles; the chin-hand pose is at cell 5). Signatures are weaker than r1a: tinker holds a device, confetti and sprint cells are both a closed-eye cheer with confetti and a raised finger (no sprint), debug has the magnifier. | Better canon, less pose variety than r1a; sprint missed. | |
| aqua-r1a | Whole-body goldfish with scales, crest fin, big blue eyes and black over-ear headphones with cyan rings. Drifted: the face is orange, not the canon golden yellow; the headphones read navy. The clearest expression set of the batch (cells 1 to 8 all differ: smile, tongue, brow-raised smirk, O mouth, droop, glare). Signatures: conduct is a thin baton, not the fin; listen, patch and flourish read. Matte clean. | Good. | |
| aqua-r1b | **Cell-count failure:** the model drew a 4x4 sheet (16 cells), not 4x3. The 12 declared labels cannot be mapped; the cutouts are labelled c01 to c16. Golden-yellow face and cyan-ringed headphones match canon. Expressions are distinct (smile, tongue, droop, glare, O mouth, closed eyes with patch cable). Rows were cropped on the nominal 4x4 grid because no row gutters exist; slivers of the row above show at the top of cells c05 to c16. | Canon colours held; sheet contract failed; labels lost. | |
| weksa-r1a | Held: topknot with turquoise and amber beads and a feather, round gold glasses, turquoise earrings, dust smudge, cream robe with rolled sleeves over a leather vest, bead necklaces, backpack with scrolls and idol, a glyph card in hand. Expressions differ readably (grin, smirk, chin hand, worry, lidded annoyance, O mouth, narrowed). Signatures good: map, fieldwork (brush and idol), argue (finger, card), interlingua (two cards). The card is in hand in several core cells. Divider lines found and trimmed. | Good. | |
| weksa-r1b | Not rendered (server error, allowance spent). | none | |
| nibu-r1a | Held: very long pale lavender hair, violet eyes, calm face, arms folded in cells 1 to 8, frilled lilac blouse, circuit sleeves, cyan ring on the shoulder. Drifted: two pink ribbons, one each side, where canon has one bow on the right; the clip is a small pink and cyan bar. Expressions are readable but subtle. Signatures: console (floating panel) good, glitch (black horizontal lines across the face, not offset slices), lore good, triumph (wink and fist) good. | Good, with the double-ribbon drift. | |
| nibu-r1b | Matches the bust: one large pink bow on the right, the pink two-bead connector clip on the left, frilled collar, cyan ring. Label order drifted by one from cell 4: cell 4 is a grin, the chin-hand pose is at 5, O mouth at 8, determined at 9; cell 10 (glitch) shows a handheld device, cell 11 shows the glitch smear, cell 12 shows the closed-eye fist, so console and triumph are mislabelled. | Better canon, label order unreliable. | |
| eureka-r1a | Held: black hair with an orange streak, blue-grey eyes, charcoal jacket with orange piping, chest straps and pouches, fingerless gloves. Drifted: the hood is down in 11 of 12 cells (canon has it up framing the face); only cell 12 shows a hood. Expressions are clear and distinct. Signatures: probe (held, not pointed), inspect (pointing finger), report (tablet), hood (eyes shadowed, smirk) good. | Good expressions; the defining hood is lost. | |
| eureka-r1b | Hood up with orange piping, orange streak, orange probe held in nearly every cell from cell 2 on: canon holds, and the bust's prop leaks into the core cells. Expressions differ readably (grin, smirk, worry, glare, O mouth). Signatures: probe at the chin (not pointed), inspect (finger point), report (notebook), hood (eyes shadowed, smirk). | Best canon fidelity of the eight pairs; the probe in every cell limits reuse. | |
| void-r1a | Not rendered (server error, allowance spent). | none | |
| void-r1b | **Cell-count failure:** 16 cells (4x4), labelled c01 to c16. Hood, scarf and white eyes hold canon exactly. Expression is carried only by the eye shapes; c01 to c04, c08 and c10 are indistinguishable neutral faces. c05 to c07 are closed-arc eyes (one with a gloved hand at the hood), c09 half-lids, c11 and c12 angry, c13 welcome, c14 document, c15 point, c16 flat slits. Matte clean. | Canon held; sheet contract failed; labels lost. | |
### What round 1 says about the hypotheses
- r1a: the character stays recognisable across the twelve cells for every sheet, and the expression cells differ in most. It
drifts on small canon details (Libby's ribbon, Kiko's headband, Heimdall's hair highlights, Nibu's second ribbon, Aqua's
face colour) and on the one defining feature of Eureka (the hood).
- r1b: the reference restores those details on all six comparable pairs (libby, heimdall, kiko, aqua, nibu, eureka). It
costs three things: the bust's pose and prop leak into cells (Heimdall's key, Eureka's probe, Libby's book, Nibu's folded
arms), cell diversity drops (Kiko), and the cell order or grid drifts on six of the seven r1b sheets rendered
(label shift on libby, heimdall, kiko, nibu; a 4x4 grid on aqua and void; only eureka-r1b holds the order). Whether the label shift is the image-1 clause
confusing the cell numbering is a conjecture, untested here.
- Both variants shift labels somewhere (libby-r1a swaps 6 and 7; heimdall-r1a does not), so a cell is best chosen by looking,
not by its declared label, until a round fixes the order.
- Not tested: whether a sheet at 12 cells of about 590 px is enough resolution for the report cutout size.
### Process notes
- The sheet asked for padding and no dividers; the model drew thin black divider lines in three r1a sheets (heimdall, weksa, eureka) and one r1b sheet
(libby), none in the rest. The crop trims them, using the line positions when found.
- Request failures, all recorded in `r1/run-log-r1.txt`: the first `libby-r1b` attempt (id `936bb7bb-48f3-4770-836e-8e02e19892ea`)
never became pollable; the first `kiko-r1b` (`419a1e26-f247-4a31-b61c-6265457a22d4`), `weksa-r1b`
(`044ad25e-87c2-4c79-9c84-28b355501f78`) and `void-r1a` (`30a333e2-db14-4610-b749-26dadbe5d187`) returned HTTP 500. The first
two were re-submitted (the two allowed retries); the last two were not. One submit (`heimdall-r1b`) was refused with HTTP 429
(credit balance low: one active task per organisation); no task was created, and it was submitted afterwards.

View file

@ -0,0 +1,30 @@
# Aqua r1a
## Hypothesis
A sheet keeps the character consistent across twelve cells from the prompt alone: the busts' shared style block adapted for a sheet, the canon character block verbatim, and twelve short cell descriptions.
## Variable changed
Baseline: prompt only, no reference image.
## Render record
- Model: FLUX 3 Image, `POST https://api.bfl.ai/v1/flux-3-image`
- Parameters: aspect_ratio 4:3, resolution 2k, safety_tolerance default, grounding default; no seed field
- Reference: none; rendered from scratch from the prompt alone
- Output: 2368x1776, source format PNG; 2k original kept out of git at F:/Projects/cast-art-originals/poses-r1/aqua/aqua-r1a.png
- Cost: about $0.10 per request (reported by API: {'cost': 10.0, 'input_mp': None, 'output_mp': None})
- Request id: 5036c049-cac8-48df-9cc6-bc01805b4d26
- Date: 2026-10-14
- Cell order: neutral, happy, amused, thinking, concerned, annoyed, surprised, determined, conduct, listen, patch, flourish
## Prompt
Character expression sheet for a game cast lineup: a sheet of twelve cells, each cell a bust, head and shoulders cropped at mid-chest by the bottom edge of the cell, the character in three-quarter view turned toward the right side of the cell, the head centred horizontally in the cell with its top a small margin below the top edge of the cell, the same crop and scale in every cell. Super-deformed chibi proportions: the character is two heads tall in total, so the head is very large compared with the small shoulders and narrow torso. Clean 2D anime illustration drawn to be traced into vector art: one bold dark outline of even weight around the whole silhouette, thinner inner lines, flat cel shading with exactly one base tone and one shadow tone per material, light from the upper left. No gradients, no texture, no painterly blending, no glow halos, no pixel art, no 3D rendering. A limited palette of five or six flat colours taken from the character's key colours. Large expressive anime eyes with two white highlights. The background is one perfectly flat, uniform, solid bright chroma-key green from edge to edge: no gradient, no vignette, no floor, no cast shadow, no particles, no props or scenery behind the figure.
The sheet is a grid of four columns by three rows, twelve cells of the same character in reading order, left to right and top to bottom, separated by generous empty padding of the same flat green, with no frames, no borders, no divider lines, no labels and no text. Every cell shows the same character with the same design, colours and proportions; the cell description sets that cell's expression and pose, and the character description below gives the design.
Aqua, a cartoon goldfish DJ. He is a fish, so his crop works like the busts: his round body fills the frame down to the bottom edge, the lower belly cut off by the bottom edge the way the busts are cut at mid-chest, the top of his crest fin a small margin below the top edge, his head and body spanning most of the frame width, the tail fin allowed to run off the side edge: a round chubby goldfish with a golden-yellow face and an orange body covered all over in clearly outlined overlapping fish scales, drawn as rows of small curved scale shapes on the body; big round blue eyes with white highlights; a wide, soft, open happy smile on a rounded puffy snout, full rounded lips with rounded corners, showing a dark mouth and a pink tongue; a little orange crest fin on top of the head; large black over-ear studio headphones with cyan rings on the ear cups. Bright orange pectoral fins, one raised, and a flowing forked orange tail fin. Key colours: orange and cyan.
Cell 1 (neutral): a calm neutral expression, mouth closed, looking ahead. Cell 2 (happy): a broad happy smile with bright eyes. Cell 3 (amused): an amused smirk with one eyebrow raised, a stifled laugh. Cell 4 (thinking): a thoughtful expression, eyes looking up and aside, one hand raised to the chin. Cell 5 (concerned): a concerned expression, brows drawn together and tilted up, a small worried frown. Cell 6 (annoyed): an annoyed expression, flat half-lidded eyes, a pursed frown. Cell 7 (surprised): a surprised expression, wide eyes, mouth open in an O. Cell 8 (determined): a determined expression, narrowed eyes, a firm set mouth, a small nod. Cell 9 (conduct): conducting with a raised pectoral fin like a baton. Cell 10 (listen): one fin pressed to a headphone ear cup, eyes closed, listening. Cell 11 (patch): plugging a cyan patch cable into a jack. Cell 12 (flourish): a showy DJ flourish with both fins spread wide.

Binary file not shown.

After

Width:  |  Height:  |  Size: 329 KiB

View file

@ -0,0 +1,32 @@
# Aqua r1b
## Hypothesis
Adding the canon bust as a reference image holds canon details the prompt alone drifts on, without pulling every cell into the bust's pose.
## Variable changed
Against the same character's r1a: the canon bust cutout on its chroma green is passed as `images` and cited as image 1 by one clause prepended to the prompt. Nothing else differs.
## Render record
- Model: FLUX 3 Image, `POST https://api.bfl.ai/v1/flux-3-image`
- Parameters: aspect_ratio 4:3, resolution 2k, safety_tolerance default, grounding default; no seed field
- Reference: canon bust r4/aqua/aqua-r4a-cutout.png composited on its chroma green, base64 in `images`, cited as image 1; reference ground rgb(14, 238, 52)
- Output: 2368x1776, source format PNG; 2k original kept out of git at F:/Projects/cast-art-originals/poses-r1/aqua/aqua-r1b.png
- Cost: about $0.10 per request (reported by API: {'cost': 10.0, 'input_mp': None, 'output_mp': None})
- Request id: 8dc4c2ff-0245-41de-9991-8055a309c852
- Date: 2026-10-14
- Cell order: neutral, happy, amused, thinking, concerned, annoyed, surprised, determined, conduct, listen, patch, flourish
## Prompt
Image 1 is the character's canon bust. The character must look exactly like the character in image 1 (same design, colours, proportions and line style) in every cell.
Character expression sheet for a game cast lineup: a sheet of twelve cells, each cell a bust, head and shoulders cropped at mid-chest by the bottom edge of the cell, the character in three-quarter view turned toward the right side of the cell, the head centred horizontally in the cell with its top a small margin below the top edge of the cell, the same crop and scale in every cell. Super-deformed chibi proportions: the character is two heads tall in total, so the head is very large compared with the small shoulders and narrow torso. Clean 2D anime illustration drawn to be traced into vector art: one bold dark outline of even weight around the whole silhouette, thinner inner lines, flat cel shading with exactly one base tone and one shadow tone per material, light from the upper left. No gradients, no texture, no painterly blending, no glow halos, no pixel art, no 3D rendering. A limited palette of five or six flat colours taken from the character's key colours. Large expressive anime eyes with two white highlights. The background is one perfectly flat, uniform, solid bright chroma-key green from edge to edge: no gradient, no vignette, no floor, no cast shadow, no particles, no props or scenery behind the figure.
The sheet is a grid of four columns by three rows, twelve cells of the same character in reading order, left to right and top to bottom, separated by generous empty padding of the same flat green, with no frames, no borders, no divider lines, no labels and no text. Every cell shows the same character with the same design, colours and proportions; the cell description sets that cell's expression and pose, and the character description below gives the design.
Aqua, a cartoon goldfish DJ. He is a fish, so his crop works like the busts: his round body fills the frame down to the bottom edge, the lower belly cut off by the bottom edge the way the busts are cut at mid-chest, the top of his crest fin a small margin below the top edge, his head and body spanning most of the frame width, the tail fin allowed to run off the side edge: a round chubby goldfish with a golden-yellow face and an orange body covered all over in clearly outlined overlapping fish scales, drawn as rows of small curved scale shapes on the body; big round blue eyes with white highlights; a wide, soft, open happy smile on a rounded puffy snout, full rounded lips with rounded corners, showing a dark mouth and a pink tongue; a little orange crest fin on top of the head; large black over-ear studio headphones with cyan rings on the ear cups. Bright orange pectoral fins, one raised, and a flowing forked orange tail fin. Key colours: orange and cyan.
Cell 1 (neutral): a calm neutral expression, mouth closed, looking ahead. Cell 2 (happy): a broad happy smile with bright eyes. Cell 3 (amused): an amused smirk with one eyebrow raised, a stifled laugh. Cell 4 (thinking): a thoughtful expression, eyes looking up and aside, one hand raised to the chin. Cell 5 (concerned): a concerned expression, brows drawn together and tilted up, a small worried frown. Cell 6 (annoyed): an annoyed expression, flat half-lidded eyes, a pursed frown. Cell 7 (surprised): a surprised expression, wide eyes, mouth open in an O. Cell 8 (determined): a determined expression, narrowed eyes, a firm set mouth, a small nod. Cell 9 (conduct): conducting with a raised pectoral fin like a baton. Cell 10 (listen): one fin pressed to a headphone ear cup, eyes closed, listening. Cell 11 (patch): plugging a cyan patch cable into a jack. Cell 12 (flourish): a showy DJ flourish with both fins spread wide.

Binary file not shown.

After

Width:  |  Height:  |  Size: 413 KiB

View file

@ -0,0 +1,60 @@
"""Round 1 checks: prompt diff across the 16 records, cell counts, matte residue, and key-material search.
The key is read here only to search for its value; it is never printed."""
import json, pathlib, re, sys, difflib
import render_r1 as R
REC = R.REC
ok = True
cellfail = []
prompts = {}
for n in R.NAMES:
for s in ("r1a", "r1b"):
f = REC / n / f"{n}-{s}.txt"
if not f.exists(): print("not rendered, no record:", f"{n}-{s}"); continue
prompts[(n, s)] = f.read_text(encoding="utf-8").split("## Prompt\n\n", 1)[1].strip()
# 1. Each record's prompt equals the one the script builds now, and the shared parts are identical across all 16.
for (n, s), p in prompts.items():
if p != R.prompt_for(n, s): ok = False; print("MISMATCH vs script:", n, s)
shared = None
for (n, s), p in prompts.items():
q = p.replace(R.REF + "\n\n", "", 1)
head = q.split("\n\n" + R.canon_block(n), 1)[0]
cells = q.split(R.canon_block(n) + "\n\n", 1)[1]
if shared is None: shared = head
if head != shared: ok = False; print("shared part differs:", n, s)
if (s == "r1b") != p.startswith(R.REF): ok = False; print("clause misplaced:", n, s)
if s == "r1b" and (n, "r1a") in prompts and q != prompts[(n, "r1a")]: ok = False; print("r1b differs from r1a beyond the clause:", n)
if not cells.startswith("Cell 1 (neutral)"): ok = False; print("cells:", n, s)
print(f"prompts: {len(prompts)} records match the script; shared style+sheet part identical across all; r1b == r1a + clause where both exist" if ok else "PROMPT CHECK FAILED")
# which segments differ between characters (r1a only)
segs = {n: (R.canon_block(n), tuple(R.cells_for(n))) for n in R.NAMES}
core_same = [R.cells_for(n)[:8] for n in R.NAMES if n != "void"]
print("core cell text identical for 7 characters, void adapted:", all(c == core_same[0] for c in core_same))
# 2. cell counts and matte residue from the crop log
log = json.loads((REC / "matte-crop-log.json").read_text(encoding="utf-8"))
for k, v in sorted(log.items()):
if v.get("missing"): print(f"{k}: not rendered, no sheet"); continue
outd = R.ORIG / k.split("-")[0] / f"{k}-cells"
files = sorted(p.name for p in outd.glob("*.png"))
exp = [f"{i + 1:02d}-{l}.png" for i, (l, _) in enumerate(R.cells_for(k.split('-')[0]))]
if k in {"aqua-r1b", "void-r1b"}:
print(f"{k}: CELL COUNT FAIL, {len(files)} cutouts (4x4 sheet drawn), declared 12; residual green px {v['residual_total']}"); cellfail.append(k); continue
good = files == exp and v["residual_total"] == 0
ok &= good
print(f"{k}: {len(files)} cutouts, order {'ok' if files == exp else 'WRONG'}, mode {v['mode']}, residual green px {v['residual_total']}, sheet corner std {v['sheet_corner_std']}")
# 3. size and key search
big = [str(p) for p in (REC.parent).rglob("*") if p.is_file() and p.stat().st_size > 2_000_000]
print("committed-tree files over 2 MB:", big or "none")
key = pathlib.Path(r"F:/Projects/bfl-api.txt").read_text().strip()
hits = []
roots = [REC.parent, pathlib.Path(sys.argv[1])] if len(sys.argv) > 1 else [REC.parent]
for root in roots:
for p in root.rglob("*"):
if p.is_file() and p.suffix in (".py", ".txt", ".md", ".json", ".log"):
if key in p.read_text(encoding="utf-8", errors="ignore"): hits.append(str(p))
print("files containing the key value:", hits or "none")
print("cell-count failures:", cellfail or "none")
print(("ALL OK" if ok and not big and not hits else "CHECK FAILED") + (" except the cell-count failures above" if cellfail and ok and not big and not hits else ""))

Binary file not shown.

After

Width:  |  Height:  |  Size: 920 KiB

View file

@ -0,0 +1,30 @@
# Eureka r1a
## Hypothesis
A sheet keeps the character consistent across twelve cells from the prompt alone: the busts' shared style block adapted for a sheet, the canon character block verbatim, and twelve short cell descriptions.
## Variable changed
Baseline: prompt only, no reference image.
## Render record
- Model: FLUX 3 Image, `POST https://api.bfl.ai/v1/flux-3-image`
- Parameters: aspect_ratio 4:3, resolution 2k, safety_tolerance default, grounding default; no seed field
- Reference: none; rendered from scratch from the prompt alone
- Output: 2368x1776, source format PNG; 2k original kept out of git at F:/Projects/cast-art-originals/poses-r1/eureka/eureka-r1a.png
- Cost: about $0.10 per request (reported by API: {'cost': 10.0, 'input_mp': None, 'output_mp': None})
- Request id: cffa8610-5235-4df0-bb0c-91d37e5146f2
- Date: 2026-10-14
- Cell order: neutral, happy, amused, thinking, concerned, annoyed, surprised, determined, probe, inspect, report, hood
## Prompt
Character expression sheet for a game cast lineup: a sheet of twelve cells, each cell a bust, head and shoulders cropped at mid-chest by the bottom edge of the cell, the character in three-quarter view turned toward the right side of the cell, the head centred horizontally in the cell with its top a small margin below the top edge of the cell, the same crop and scale in every cell. Super-deformed chibi proportions: the character is two heads tall in total, so the head is very large compared with the small shoulders and narrow torso. Clean 2D anime illustration drawn to be traced into vector art: one bold dark outline of even weight around the whole silhouette, thinner inner lines, flat cel shading with exactly one base tone and one shadow tone per material, light from the upper left. No gradients, no texture, no painterly blending, no glow halos, no pixel art, no 3D rendering. A limited palette of five or six flat colours taken from the character's key colours. Large expressive anime eyes with two white highlights. The background is one perfectly flat, uniform, solid bright chroma-key green from edge to edge: no gradient, no vignette, no floor, no cast shadow, no particles, no props or scenery behind the figure.
The sheet is a grid of four columns by three rows, twelve cells of the same character in reading order, left to right and top to bottom, separated by generous empty padding of the same flat green, with no frames, no borders, no divider lines, no labels and no text. Every cell shows the same character with the same design, colours and proportions; the cell description sets that cell's expression and pose, and the character description below gives the design.
Eureka, a neon-noir bug hunter: a young woman with messy shoulder-length black hair with one bright orange streak in the fringe, sharp focused blue-grey eyes, a slight knowing smile. She wears a dark charcoal trenchcoat with the hood up, framing her face, and a high collar; the hood's edge and the coat's seams are piped with ember-orange lines, over tactical gear: chest straps, buckles and pouches. Fingerless gloves; she holds a slim orange metal probe. Key colour: ember orange.
Cell 1 (neutral): a calm neutral expression, mouth closed, looking ahead. Cell 2 (happy): a broad happy smile with bright eyes. Cell 3 (amused): an amused smirk with one eyebrow raised, a stifled laugh. Cell 4 (thinking): a thoughtful expression, eyes looking up and aside, one hand raised to the chin. Cell 5 (concerned): a concerned expression, brows drawn together and tilted up, a small worried frown. Cell 6 (annoyed): an annoyed expression, flat half-lidded eyes, a pursed frown. Cell 7 (surprised): a surprised expression, wide eyes, mouth open in an O. Cell 8 (determined): a determined expression, narrowed eyes, a firm set mouth, a small nod. Cell 9 (probe): pointing the orange probe forward. Cell 10 (inspect): leaning in with narrowed eyes to inspect something closely. Cell 11 (report): presenting a thin tablet showing a report. Cell 12 (hood): the hood pulled low, shadowing her eyes, only a knowing smirk visible.

Binary file not shown.

After

Width:  |  Height:  |  Size: 238 KiB

View file

@ -0,0 +1,32 @@
# Eureka r1b
## Hypothesis
Adding the canon bust as a reference image holds canon details the prompt alone drifts on, without pulling every cell into the bust's pose.
## Variable changed
Against the same character's r1a: the canon bust cutout on its chroma green is passed as `images` and cited as image 1 by one clause prepended to the prompt. Nothing else differs.
## Render record
- Model: FLUX 3 Image, `POST https://api.bfl.ai/v1/flux-3-image`
- Parameters: aspect_ratio 4:3, resolution 2k, safety_tolerance default, grounding default; no seed field
- Reference: canon bust r2/eureka/eureka-r2a-cutout.png composited on its chroma green, base64 in `images`, cited as image 1; reference ground rgb(15, 255, 26)
- Output: 2368x1776, source format PNG; 2k original kept out of git at F:/Projects/cast-art-originals/poses-r1/eureka/eureka-r1b.png
- Cost: about $0.10 per request (reported by API: {'cost': 10.0, 'input_mp': None, 'output_mp': None})
- Request id: 63328793-f3e5-4dab-9e98-cefb2d5e1f9a
- Date: 2026-10-14
- Cell order: neutral, happy, amused, thinking, concerned, annoyed, surprised, determined, probe, inspect, report, hood
## Prompt
Image 1 is the character's canon bust. The character must look exactly like the character in image 1 (same design, colours, proportions and line style) in every cell.
Character expression sheet for a game cast lineup: a sheet of twelve cells, each cell a bust, head and shoulders cropped at mid-chest by the bottom edge of the cell, the character in three-quarter view turned toward the right side of the cell, the head centred horizontally in the cell with its top a small margin below the top edge of the cell, the same crop and scale in every cell. Super-deformed chibi proportions: the character is two heads tall in total, so the head is very large compared with the small shoulders and narrow torso. Clean 2D anime illustration drawn to be traced into vector art: one bold dark outline of even weight around the whole silhouette, thinner inner lines, flat cel shading with exactly one base tone and one shadow tone per material, light from the upper left. No gradients, no texture, no painterly blending, no glow halos, no pixel art, no 3D rendering. A limited palette of five or six flat colours taken from the character's key colours. Large expressive anime eyes with two white highlights. The background is one perfectly flat, uniform, solid bright chroma-key green from edge to edge: no gradient, no vignette, no floor, no cast shadow, no particles, no props or scenery behind the figure.
The sheet is a grid of four columns by three rows, twelve cells of the same character in reading order, left to right and top to bottom, separated by generous empty padding of the same flat green, with no frames, no borders, no divider lines, no labels and no text. Every cell shows the same character with the same design, colours and proportions; the cell description sets that cell's expression and pose, and the character description below gives the design.
Eureka, a neon-noir bug hunter: a young woman with messy shoulder-length black hair with one bright orange streak in the fringe, sharp focused blue-grey eyes, a slight knowing smile. She wears a dark charcoal trenchcoat with the hood up, framing her face, and a high collar; the hood's edge and the coat's seams are piped with ember-orange lines, over tactical gear: chest straps, buckles and pouches. Fingerless gloves; she holds a slim orange metal probe. Key colour: ember orange.
Cell 1 (neutral): a calm neutral expression, mouth closed, looking ahead. Cell 2 (happy): a broad happy smile with bright eyes. Cell 3 (amused): an amused smirk with one eyebrow raised, a stifled laugh. Cell 4 (thinking): a thoughtful expression, eyes looking up and aside, one hand raised to the chin. Cell 5 (concerned): a concerned expression, brows drawn together and tilted up, a small worried frown. Cell 6 (annoyed): an annoyed expression, flat half-lidded eyes, a pursed frown. Cell 7 (surprised): a surprised expression, wide eyes, mouth open in an O. Cell 8 (determined): a determined expression, narrowed eyes, a firm set mouth, a small nod. Cell 9 (probe): pointing the orange probe forward. Cell 10 (inspect): leaning in with narrowed eyes to inspect something closely. Cell 11 (report): presenting a thin tablet showing a report. Cell 12 (hood): the hood pulled low, shadowing her eyes, only a knowing smirk visible.

Binary file not shown.

After

Width:  |  Height:  |  Size: 279 KiB

View file

@ -0,0 +1,30 @@
# Heimdall r1a
## Hypothesis
A sheet keeps the character consistent across twelve cells from the prompt alone: the busts' shared style block adapted for a sheet, the canon character block verbatim, and twelve short cell descriptions.
## Variable changed
Baseline: prompt only, no reference image.
## Render record
- Model: FLUX 3 Image, `POST https://api.bfl.ai/v1/flux-3-image`
- Parameters: aspect_ratio 4:3, resolution 2k, safety_tolerance default, grounding default; no seed field
- Reference: none; rendered from scratch from the prompt alone
- Output: 2368x1776, source format PNG; 2k original kept out of git at F:/Projects/cast-art-originals/poses-r1/heimdall/heimdall-r1a.png
- Cost: about $0.10 per request (reported by API: {'cost': 10.0, 'input_mp': None, 'output_mp': None})
- Request id: a051f0ca-f250-4aa8-a47f-c5195dbe94bc
- Date: 2026-10-14
- Cell order: neutral, happy, amused, thinking, concerned, annoyed, surprised, determined, badge, barrier, protect, revoke
## Prompt
Character expression sheet for a game cast lineup: a sheet of twelve cells, each cell a bust, head and shoulders cropped at mid-chest by the bottom edge of the cell, the character in three-quarter view turned toward the right side of the cell, the head centred horizontally in the cell with its top a small margin below the top edge of the cell, the same crop and scale in every cell. Super-deformed chibi proportions: the character is two heads tall in total, so the head is very large compared with the small shoulders and narrow torso. Clean 2D anime illustration drawn to be traced into vector art: one bold dark outline of even weight around the whole silhouette, thinner inner lines, flat cel shading with exactly one base tone and one shadow tone per material, light from the upper left. No gradients, no texture, no painterly blending, no glow halos, no pixel art, no 3D rendering. A limited palette of five or six flat colours taken from the character's key colours. Large expressive anime eyes with two white highlights. The background is one perfectly flat, uniform, solid bright chroma-key green from edge to edge: no gradient, no vignette, no floor, no cast shadow, no particles, no props or scenery behind the figure.
The sheet is a grid of four columns by three rows, twelve cells of the same character in reading order, left to right and top to bottom, separated by generous empty padding of the same flat green, with no frames, no borders, no divider lines, no labels and no text. Every cell shows the same character with the same design, colours and proportions; the cell description sets that cell's expression and pose, and the character description below gives the design.
Heimdall, a stern young gatekeeper: dark brown skin, a mop of messy dark brown curly hair with golden highlights, glowing golden amber eyes, a serious frown, one small gold earring. He wears a high-collared black coat with royal blue lapels and a royal blue cape trimmed in gold filigree, small blue gems on the shoulder armour, and a gold key-shaped clasp at the throat. He holds an ornate golden key raised beside his shoulder. Key colours: gold and cobalt blue.
Cell 1 (neutral): a calm neutral expression, mouth closed, looking ahead. Cell 2 (happy): a broad happy smile with bright eyes. Cell 3 (amused): an amused smirk with one eyebrow raised, a stifled laugh. Cell 4 (thinking): a thoughtful expression, eyes looking up and aside, one hand raised to the chin. Cell 5 (concerned): a concerned expression, brows drawn together and tilted up, a small worried frown. Cell 6 (annoyed): an annoyed expression, flat half-lidded eyes, a pursed frown. Cell 7 (surprised): a surprised expression, wide eyes, mouth open in an O. Cell 8 (determined): a determined expression, narrowed eyes, a firm set mouth, a small nod. Cell 9 (badge): holding up a gold badge of authority toward the viewer. Cell 10 (barrier): one palm raised forward, projecting a blue barrier. Cell 11 (protect): stepping forward with his cape swept out in front, shielding someone behind him. Cell 12 (revoke): pointing the golden key downward with a sharp cross-out gesture of the other hand, revoking access.

Binary file not shown.

After

Width:  |  Height:  |  Size: 262 KiB

View file

@ -0,0 +1,32 @@
# Heimdall r1b
## Hypothesis
Adding the canon bust as a reference image holds canon details the prompt alone drifts on, without pulling every cell into the bust's pose.
## Variable changed
Against the same character's r1a: the canon bust cutout on its chroma green is passed as `images` and cited as image 1 by one clause prepended to the prompt. Nothing else differs.
## Render record
- Model: FLUX 3 Image, `POST https://api.bfl.ai/v1/flux-3-image`
- Parameters: aspect_ratio 4:3, resolution 2k, safety_tolerance default, grounding default; no seed field
- Reference: canon bust r2/heimdall/heimdall-r2a-cutout.png composited on its chroma green, base64 in `images`, cited as image 1; reference ground rgb(18, 250, 72)
- Output: 2368x1776, source format PNG; 2k original kept out of git at F:/Projects/cast-art-originals/poses-r1/heimdall/heimdall-r1b.png
- Cost: about $0.10 per request (reported by API: {'cost': 10.0, 'input_mp': None, 'output_mp': None})
- Request id: 68ecec4c-3301-458d-8ae2-b7171ae8fbb0
- Date: 2026-10-14
- Cell order: neutral, happy, amused, thinking, concerned, annoyed, surprised, determined, badge, barrier, protect, revoke
## Prompt
Image 1 is the character's canon bust. The character must look exactly like the character in image 1 (same design, colours, proportions and line style) in every cell.
Character expression sheet for a game cast lineup: a sheet of twelve cells, each cell a bust, head and shoulders cropped at mid-chest by the bottom edge of the cell, the character in three-quarter view turned toward the right side of the cell, the head centred horizontally in the cell with its top a small margin below the top edge of the cell, the same crop and scale in every cell. Super-deformed chibi proportions: the character is two heads tall in total, so the head is very large compared with the small shoulders and narrow torso. Clean 2D anime illustration drawn to be traced into vector art: one bold dark outline of even weight around the whole silhouette, thinner inner lines, flat cel shading with exactly one base tone and one shadow tone per material, light from the upper left. No gradients, no texture, no painterly blending, no glow halos, no pixel art, no 3D rendering. A limited palette of five or six flat colours taken from the character's key colours. Large expressive anime eyes with two white highlights. The background is one perfectly flat, uniform, solid bright chroma-key green from edge to edge: no gradient, no vignette, no floor, no cast shadow, no particles, no props or scenery behind the figure.
The sheet is a grid of four columns by three rows, twelve cells of the same character in reading order, left to right and top to bottom, separated by generous empty padding of the same flat green, with no frames, no borders, no divider lines, no labels and no text. Every cell shows the same character with the same design, colours and proportions; the cell description sets that cell's expression and pose, and the character description below gives the design.
Heimdall, a stern young gatekeeper: dark brown skin, a mop of messy dark brown curly hair with golden highlights, glowing golden amber eyes, a serious frown, one small gold earring. He wears a high-collared black coat with royal blue lapels and a royal blue cape trimmed in gold filigree, small blue gems on the shoulder armour, and a gold key-shaped clasp at the throat. He holds an ornate golden key raised beside his shoulder. Key colours: gold and cobalt blue.
Cell 1 (neutral): a calm neutral expression, mouth closed, looking ahead. Cell 2 (happy): a broad happy smile with bright eyes. Cell 3 (amused): an amused smirk with one eyebrow raised, a stifled laugh. Cell 4 (thinking): a thoughtful expression, eyes looking up and aside, one hand raised to the chin. Cell 5 (concerned): a concerned expression, brows drawn together and tilted up, a small worried frown. Cell 6 (annoyed): an annoyed expression, flat half-lidded eyes, a pursed frown. Cell 7 (surprised): a surprised expression, wide eyes, mouth open in an O. Cell 8 (determined): a determined expression, narrowed eyes, a firm set mouth, a small nod. Cell 9 (badge): holding up a gold badge of authority toward the viewer. Cell 10 (barrier): one palm raised forward, projecting a blue barrier. Cell 11 (protect): stepping forward with his cape swept out in front, shielding someone behind him. Cell 12 (revoke): pointing the golden key downward with a sharp cross-out gesture of the other hand, revoking access.

Binary file not shown.

After

Width:  |  Height:  |  Size: 290 KiB

View file

@ -0,0 +1,30 @@
# Kiko r1a
## Hypothesis
A sheet keeps the character consistent across twelve cells from the prompt alone: the busts' shared style block adapted for a sheet, the canon character block verbatim, and twelve short cell descriptions.
## Variable changed
Baseline: prompt only, no reference image.
## Render record
- Model: FLUX 3 Image, `POST https://api.bfl.ai/v1/flux-3-image`
- Parameters: aspect_ratio 4:3, resolution 2k, safety_tolerance default, grounding default; no seed field
- Reference: none; rendered from scratch from the prompt alone
- Output: 2368x1776, source format PNG; 2k original kept out of git at F:/Projects/cast-art-originals/poses-r1/kiko/kiko-r1a.png
- Cost: about $0.10 per request (reported by API: {'cost': 10.0, 'input_mp': None, 'output_mp': None})
- Request id: 2414b18b-bda2-4f88-bcad-f060fa52965a
- Date: 2026-10-14
- Cell order: neutral, happy, amused, thinking, concerned, annoyed, surprised, determined, tinker, confetti, sprint, debug
## Prompt
Character expression sheet for a game cast lineup: a sheet of twelve cells, each cell a bust, head and shoulders cropped at mid-chest by the bottom edge of the cell, the character in three-quarter view turned toward the right side of the cell, the head centred horizontally in the cell with its top a small margin below the top edge of the cell, the same crop and scale in every cell. Super-deformed chibi proportions: the character is two heads tall in total, so the head is very large compared with the small shoulders and narrow torso. Clean 2D anime illustration drawn to be traced into vector art: one bold dark outline of even weight around the whole silhouette, thinner inner lines, flat cel shading with exactly one base tone and one shadow tone per material, light from the upper left. No gradients, no texture, no painterly blending, no glow halos, no pixel art, no 3D rendering. A limited palette of five or six flat colours taken from the character's key colours. Large expressive anime eyes with two white highlights. The background is one perfectly flat, uniform, solid bright chroma-key green from edge to edge: no gradient, no vignette, no floor, no cast shadow, no particles, no props or scenery behind the figure.
The sheet is a grid of four columns by three rows, twelve cells of the same character in reading order, left to right and top to bottom, separated by generous empty padding of the same flat green, with no frames, no borders, no divider lines, no labels and no text. Every cell shows the same character with the same design, colours and proportions; the cell description sets that cell's expression and pose, and the character description below gives the design.
Kiko, an excitable fox-girl streamer: messy white shoulder-length hair, tall white fox ears with pink insides, a white kitsune fox mask with red and magenta markings worn pushed up on top of her head, black hair ornaments with gold bells and magenta tassels, bright cyan eyes, a wide open-mouthed grin with one small fang, one hand raised in a wave. She wears a black kimono-style jacket with magenta and teal trim and a gold bell at the collar. A fluffy white fox tail with pink tips curls up behind one shoulder. Key colours: magenta and cyan.
Cell 1 (neutral): a calm neutral expression, mouth closed, looking ahead. Cell 2 (happy): a broad happy smile with bright eyes. Cell 3 (amused): an amused smirk with one eyebrow raised, a stifled laugh. Cell 4 (thinking): a thoughtful expression, eyes looking up and aside, one hand raised to the chin. Cell 5 (concerned): a concerned expression, brows drawn together and tilted up, a small worried frown. Cell 6 (annoyed): an annoyed expression, flat half-lidded eyes, a pursed frown. Cell 7 (surprised): a surprised expression, wide eyes, mouth open in an O. Cell 8 (determined): a determined expression, narrowed eyes, a firm set mouth, a small nod. Cell 9 (tinker): tinkering with a small gadget, tongue out in concentration. Cell 10 (confetti): throwing confetti into the air, cheering. Cell 11 (sprint): leaning forward as if sprinting, hair and tail streaming backward. Cell 12 (debug): squinting through a magnifying lens at a tiny bug held between two fingers.

Binary file not shown.

After

Width:  |  Height:  |  Size: 289 KiB

View file

@ -0,0 +1,32 @@
# Kiko r1b
## Hypothesis
Adding the canon bust as a reference image holds canon details the prompt alone drifts on, without pulling every cell into the bust's pose.
## Variable changed
Against the same character's r1a: the canon bust cutout on its chroma green is passed as `images` and cited as image 1 by one clause prepended to the prompt. Nothing else differs.
## Render record
- Model: FLUX 3 Image, `POST https://api.bfl.ai/v1/flux-3-image`
- Parameters: aspect_ratio 4:3, resolution 2k, safety_tolerance default, grounding default; no seed field
- Reference: canon bust r2/kiko/kiko-r2a-cutout.png composited on its chroma green, base64 in `images`, cited as image 1; reference ground rgb(17, 255, 11)
- Output: 2368x1776, source format PNG; 2k original kept out of git at F:/Projects/cast-art-originals/poses-r1/kiko/kiko-r1b.png
- Cost: about $0.10 per request (reported by API: {'cost': 10.0, 'input_mp': None, 'output_mp': None})
- Request id: 15e7b364-1771-4136-9532-c5b012524609
- Date: 2026-10-14
- Cell order: neutral, happy, amused, thinking, concerned, annoyed, surprised, determined, tinker, confetti, sprint, debug
## Prompt
Image 1 is the character's canon bust. The character must look exactly like the character in image 1 (same design, colours, proportions and line style) in every cell.
Character expression sheet for a game cast lineup: a sheet of twelve cells, each cell a bust, head and shoulders cropped at mid-chest by the bottom edge of the cell, the character in three-quarter view turned toward the right side of the cell, the head centred horizontally in the cell with its top a small margin below the top edge of the cell, the same crop and scale in every cell. Super-deformed chibi proportions: the character is two heads tall in total, so the head is very large compared with the small shoulders and narrow torso. Clean 2D anime illustration drawn to be traced into vector art: one bold dark outline of even weight around the whole silhouette, thinner inner lines, flat cel shading with exactly one base tone and one shadow tone per material, light from the upper left. No gradients, no texture, no painterly blending, no glow halos, no pixel art, no 3D rendering. A limited palette of five or six flat colours taken from the character's key colours. Large expressive anime eyes with two white highlights. The background is one perfectly flat, uniform, solid bright chroma-key green from edge to edge: no gradient, no vignette, no floor, no cast shadow, no particles, no props or scenery behind the figure.
The sheet is a grid of four columns by three rows, twelve cells of the same character in reading order, left to right and top to bottom, separated by generous empty padding of the same flat green, with no frames, no borders, no divider lines, no labels and no text. Every cell shows the same character with the same design, colours and proportions; the cell description sets that cell's expression and pose, and the character description below gives the design.
Kiko, an excitable fox-girl streamer: messy white shoulder-length hair, tall white fox ears with pink insides, a white kitsune fox mask with red and magenta markings worn pushed up on top of her head, black hair ornaments with gold bells and magenta tassels, bright cyan eyes, a wide open-mouthed grin with one small fang, one hand raised in a wave. She wears a black kimono-style jacket with magenta and teal trim and a gold bell at the collar. A fluffy white fox tail with pink tips curls up behind one shoulder. Key colours: magenta and cyan.
Cell 1 (neutral): a calm neutral expression, mouth closed, looking ahead. Cell 2 (happy): a broad happy smile with bright eyes. Cell 3 (amused): an amused smirk with one eyebrow raised, a stifled laugh. Cell 4 (thinking): a thoughtful expression, eyes looking up and aside, one hand raised to the chin. Cell 5 (concerned): a concerned expression, brows drawn together and tilted up, a small worried frown. Cell 6 (annoyed): an annoyed expression, flat half-lidded eyes, a pursed frown. Cell 7 (surprised): a surprised expression, wide eyes, mouth open in an O. Cell 8 (determined): a determined expression, narrowed eyes, a firm set mouth, a small nod. Cell 9 (tinker): tinkering with a small gadget, tongue out in concentration. Cell 10 (confetti): throwing confetti into the air, cheering. Cell 11 (sprint): leaning forward as if sprinting, hair and tail streaming backward. Cell 12 (debug): squinting through a magnifying lens at a tiny bug held between two fingers.

Binary file not shown.

After

Width:  |  Height:  |  Size: 331 KiB

View file

@ -0,0 +1,30 @@
# Libby r1a
## Hypothesis
A sheet keeps the character consistent across twelve cells from the prompt alone: the busts' shared style block adapted for a sheet, the canon character block verbatim, and twelve short cell descriptions.
## Variable changed
Baseline: prompt only, no reference image.
## Render record
- Model: FLUX 3 Image, `POST https://api.bfl.ai/v1/flux-3-image`
- Parameters: aspect_ratio 4:3, resolution 2k, safety_tolerance default, grounding default; no seed field
- Reference: none; rendered from scratch from the prompt alone
- Output: 2368x1776, source format PNG; 2k original kept out of git at F:/Projects/cast-art-originals/poses-r1/libby/libby-r1a.png
- Cost: about $0.10 per request (reported by API: {'cost': 10.0, 'input_mp': None, 'output_mp': None})
- Request id: b12cd042-63fc-4e99-85af-a239f60ec937
- Date: 2026-10-14
- Cell order: neutral, happy, amused, thinking, concerned, annoyed, surprised, determined, stamp, research, shush, schema
## Prompt
Character expression sheet for a game cast lineup: a sheet of twelve cells, each cell a bust, head and shoulders cropped at mid-chest by the bottom edge of the cell, the character in three-quarter view turned toward the right side of the cell, the head centred horizontally in the cell with its top a small margin below the top edge of the cell, the same crop and scale in every cell. Super-deformed chibi proportions: the character is two heads tall in total, so the head is very large compared with the small shoulders and narrow torso. Clean 2D anime illustration drawn to be traced into vector art: one bold dark outline of even weight around the whole silhouette, thinner inner lines, flat cel shading with exactly one base tone and one shadow tone per material, light from the upper left. No gradients, no texture, no painterly blending, no glow halos, no pixel art, no 3D rendering. A limited palette of five or six flat colours taken from the character's key colours. Large expressive anime eyes with two white highlights. The background is one perfectly flat, uniform, solid bright chroma-key green from edge to edge: no gradient, no vignette, no floor, no cast shadow, no particles, no props or scenery behind the figure.
The sheet is a grid of four columns by three rows, twelve cells of the same character in reading order, left to right and top to bottom, separated by generous empty padding of the same flat green, with no frames, no borders, no divider lines, no labels and no text. Every cell shows the same character with the same design, colours and proportions; the cell description sets that cell's expression and pose, and the character description below gives the design.
Libby, a cheerful young librarian-witch, warm and bookish: thick voluminous wavy hair in a deep dusky violet-lavender with a big swept side fringe, gathered into one loose, fat wavy braid that falls forward over her right shoulder; a white crossed-bone hair clip on the left side of her head; a dark purple ribbon bow with a mauve diamond pattern tied at the top of the braid. Round thin black-framed glasses, large grey-violet eyes, small gold drop earrings, pale skin with rosy cheeks, a big open-mouthed happy smile. She wears a high-collared black scholar's robe with wide sleeves, embroidered in gold and dusky mauve diamond and rune patterns, with a violet gem brooch in a gold setting at the collar. She hugs an old brown leather book with gold corners against her chest, a faint violet light along its page edges. Key colours: black and gold with violet.
Cell 1 (neutral): a calm neutral expression, mouth closed, looking ahead. Cell 2 (happy): a broad happy smile with bright eyes. Cell 3 (amused): an amused smirk with one eyebrow raised, a stifled laugh. Cell 4 (thinking): a thoughtful expression, eyes looking up and aside, one hand raised to the chin. Cell 5 (concerned): a concerned expression, brows drawn together and tilted up, a small worried frown. Cell 6 (annoyed): an annoyed expression, flat half-lidded eyes, a pursed frown. Cell 7 (surprised): a surprised expression, wide eyes, mouth open in an O. Cell 8 (determined): a determined expression, narrowed eyes, a firm set mouth, a small nod. Cell 9 (stamp): stamping a library due-date stamp down onto a book with a cheerful thump. Cell 10 (research): peering closely at an open old book held in both hands. Cell 11 (shush): one finger raised to her lips in a shushing gesture. Cell 12 (schema): holding up a glowing violet diagram of boxes and arrows, explaining.

Binary file not shown.

After

Width:  |  Height:  |  Size: 310 KiB

View file

@ -0,0 +1,32 @@
# Libby r1b
## Hypothesis
Adding the canon bust as a reference image holds canon details the prompt alone drifts on, without pulling every cell into the bust's pose.
## Variable changed
Against the same character's r1a: the canon bust cutout on its chroma green is passed as `images` and cited as image 1 by one clause prepended to the prompt. Nothing else differs.
## Render record
- Model: FLUX 3 Image, `POST https://api.bfl.ai/v1/flux-3-image`
- Parameters: aspect_ratio 4:3, resolution 2k, safety_tolerance default, grounding default; no seed field
- Reference: canon bust r2/libby/libby-r2a-cutout.png composited on its chroma green, base64 in `images`, cited as image 1; reference ground rgb(23, 219, 83)
- Output: 2368x1776, source format PNG; 2k original kept out of git at F:/Projects/cast-art-originals/poses-r1/libby/libby-r1b.png
- Cost: about $0.10 per request (reported by API: {'cost': 10.0, 'input_mp': None, 'output_mp': None})
- Request id: a4b50eab-abda-4021-8f08-8aa81c894a05
- Date: 2026-10-14
- Cell order: neutral, happy, amused, thinking, concerned, annoyed, surprised, determined, stamp, research, shush, schema
## Prompt
Image 1 is the character's canon bust. The character must look exactly like the character in image 1 (same design, colours, proportions and line style) in every cell.
Character expression sheet for a game cast lineup: a sheet of twelve cells, each cell a bust, head and shoulders cropped at mid-chest by the bottom edge of the cell, the character in three-quarter view turned toward the right side of the cell, the head centred horizontally in the cell with its top a small margin below the top edge of the cell, the same crop and scale in every cell. Super-deformed chibi proportions: the character is two heads tall in total, so the head is very large compared with the small shoulders and narrow torso. Clean 2D anime illustration drawn to be traced into vector art: one bold dark outline of even weight around the whole silhouette, thinner inner lines, flat cel shading with exactly one base tone and one shadow tone per material, light from the upper left. No gradients, no texture, no painterly blending, no glow halos, no pixel art, no 3D rendering. A limited palette of five or six flat colours taken from the character's key colours. Large expressive anime eyes with two white highlights. The background is one perfectly flat, uniform, solid bright chroma-key green from edge to edge: no gradient, no vignette, no floor, no cast shadow, no particles, no props or scenery behind the figure.
The sheet is a grid of four columns by three rows, twelve cells of the same character in reading order, left to right and top to bottom, separated by generous empty padding of the same flat green, with no frames, no borders, no divider lines, no labels and no text. Every cell shows the same character with the same design, colours and proportions; the cell description sets that cell's expression and pose, and the character description below gives the design.
Libby, a cheerful young librarian-witch, warm and bookish: thick voluminous wavy hair in a deep dusky violet-lavender with a big swept side fringe, gathered into one loose, fat wavy braid that falls forward over her right shoulder; a white crossed-bone hair clip on the left side of her head; a dark purple ribbon bow with a mauve diamond pattern tied at the top of the braid. Round thin black-framed glasses, large grey-violet eyes, small gold drop earrings, pale skin with rosy cheeks, a big open-mouthed happy smile. She wears a high-collared black scholar's robe with wide sleeves, embroidered in gold and dusky mauve diamond and rune patterns, with a violet gem brooch in a gold setting at the collar. She hugs an old brown leather book with gold corners against her chest, a faint violet light along its page edges. Key colours: black and gold with violet.
Cell 1 (neutral): a calm neutral expression, mouth closed, looking ahead. Cell 2 (happy): a broad happy smile with bright eyes. Cell 3 (amused): an amused smirk with one eyebrow raised, a stifled laugh. Cell 4 (thinking): a thoughtful expression, eyes looking up and aside, one hand raised to the chin. Cell 5 (concerned): a concerned expression, brows drawn together and tilted up, a small worried frown. Cell 6 (annoyed): an annoyed expression, flat half-lidded eyes, a pursed frown. Cell 7 (surprised): a surprised expression, wide eyes, mouth open in an O. Cell 8 (determined): a determined expression, narrowed eyes, a firm set mouth, a small nod. Cell 9 (stamp): stamping a library due-date stamp down onto a book with a cheerful thump. Cell 10 (research): peering closely at an open old book held in both hands. Cell 11 (shush): one finger raised to her lips in a shushing gesture. Cell 12 (schema): holding up a glowing violet diagram of boxes and arrows, explaining.

Binary file not shown.

After

Width:  |  Height:  |  Size: 326 KiB

View file

@ -0,0 +1,612 @@
{
"libby-r1a": {
"size": [
2368,
1776
],
"mode": "cols gutters, rows gutters",
"cells": 12,
"labels": [
"neutral",
"happy",
"amused",
"thinking",
"concerned",
"annoyed",
"surprised",
"determined",
"stamp",
"research",
"shush",
"schema"
],
"sheet_corner_std": [
2.1,
1.7
],
"min_cell_corner_greenness": 187,
"residual_green_px_per_cell": [
0,
0,
0,
0,
0,
0,
0,
0,
0,
0,
0,
0
],
"residual_total": 0
},
"libby-r1b": {
"size": [
2368,
1776
],
"mode": "cols divider lines, rows divider lines",
"cells": 12,
"labels": [
"neutral",
"happy",
"amused",
"thinking",
"concerned",
"annoyed",
"surprised",
"determined",
"stamp",
"research",
"shush",
"schema"
],
"sheet_corner_std": [
2.0,
1.9
],
"min_cell_corner_greenness": 148,
"residual_green_px_per_cell": [
0,
0,
0,
0,
0,
0,
0,
0,
0,
0,
0,
0
],
"residual_total": 0
},
"heimdall-r1a": {
"size": [
2368,
1776
],
"mode": "cols divider lines, rows divider lines",
"cells": 12,
"labels": [
"neutral",
"happy",
"amused",
"thinking",
"concerned",
"annoyed",
"surprised",
"determined",
"badge",
"barrier",
"protect",
"revoke"
],
"sheet_corner_std": [
2.1,
2.0
],
"min_cell_corner_greenness": 231,
"residual_green_px_per_cell": [
0,
0,
0,
0,
0,
0,
0,
0,
0,
0,
0,
0
],
"residual_total": 0
},
"heimdall-r1b": {
"size": [
2368,
1776
],
"mode": "cols gutters, rows gutters",
"cells": 12,
"labels": [
"neutral",
"happy",
"amused",
"thinking",
"concerned",
"annoyed",
"surprised",
"determined",
"badge",
"barrier",
"protect",
"revoke"
],
"sheet_corner_std": [
2.5,
2.1
],
"min_cell_corner_greenness": 160,
"residual_green_px_per_cell": [
0,
0,
0,
0,
0,
0,
0,
0,
0,
0,
0,
0
],
"residual_total": 0
},
"kiko-r1a": {
"size": [
2368,
1776
],
"mode": "cols runs 5, rows gutters; cols fell back to the nominal grid",
"cells": 12,
"labels": [
"neutral",
"happy",
"amused",
"thinking",
"concerned",
"annoyed",
"surprised",
"determined",
"tinker",
"confetti",
"sprint",
"debug"
],
"sheet_corner_std": [
2.4,
2.6
],
"min_cell_corner_greenness": 177,
"residual_green_px_per_cell": [
0,
0,
0,
0,
0,
0,
0,
0,
0,
0,
0,
0
],
"residual_total": 0
},
"kiko-r1b": {
"size": [
2368,
1776
],
"mode": "cols gutters, rows gutters",
"cells": 12,
"labels": [
"neutral",
"happy",
"amused",
"thinking",
"concerned",
"annoyed",
"surprised",
"determined",
"tinker",
"confetti",
"sprint",
"debug"
],
"sheet_corner_std": [
2.0,
2.2
],
"min_cell_corner_greenness": 224,
"residual_green_px_per_cell": [
0,
0,
0,
0,
0,
0,
0,
0,
0,
0,
0,
0
],
"residual_total": 0
},
"aqua-r1a": {
"size": [
2368,
1776
],
"mode": "cols gutters, rows gutters",
"cells": 12,
"labels": [
"neutral",
"happy",
"amused",
"thinking",
"concerned",
"annoyed",
"surprised",
"determined",
"conduct",
"listen",
"patch",
"flourish"
],
"sheet_corner_std": [
2.3,
2.1
],
"min_cell_corner_greenness": 165,
"residual_green_px_per_cell": [
0,
0,
0,
0,
0,
0,
0,
0,
0,
0,
0,
0
],
"residual_total": 0
},
"aqua-r1b": {
"size": [
2368,
1776
],
"mode": "cols gutters, rows runs 1; rows fell back to the nominal grid",
"cells": 16,
"labels": [
"c01",
"c02",
"c03",
"c04",
"c05",
"c06",
"c07",
"c08",
"c09",
"c10",
"c11",
"c12",
"c13",
"c14",
"c15",
"c16"
],
"sheet_corner_std": [
2.1,
2.6
],
"min_cell_corner_greenness": 205,
"residual_green_px_per_cell": [
0,
0,
0,
0,
0,
0,
0,
0,
0,
0,
0,
0,
0,
0,
0,
0
],
"residual_total": 0
},
"weksa-r1a": {
"size": [
2368,
1776
],
"mode": "cols divider lines, rows divider lines",
"cells": 12,
"labels": [
"neutral",
"happy",
"amused",
"thinking",
"concerned",
"annoyed",
"surprised",
"determined",
"map",
"fieldwork",
"argue",
"interlingua"
],
"sheet_corner_std": [
1.9,
1.9
],
"min_cell_corner_greenness": 183,
"residual_green_px_per_cell": [
0,
0,
0,
0,
0,
0,
0,
0,
0,
0,
0,
0
],
"residual_total": 0
},
"weksa-r1b": {
"missing": true
},
"nibu-r1a": {
"size": [
2368,
1776
],
"mode": "cols gutters, rows gutters",
"cells": 12,
"labels": [
"neutral",
"happy",
"amused",
"thinking",
"concerned",
"annoyed",
"surprised",
"determined",
"console",
"glitch",
"lore",
"triumph"
],
"sheet_corner_std": [
2.9,
2.4
],
"min_cell_corner_greenness": 163,
"residual_green_px_per_cell": [
0,
0,
0,
0,
0,
0,
0,
0,
0,
0,
0,
0
],
"residual_total": 0
},
"nibu-r1b": {
"size": [
2368,
1776
],
"mode": "cols runs 5, rows gutters; cols fell back to the nominal grid",
"cells": 12,
"labels": [
"neutral",
"happy",
"amused",
"thinking",
"concerned",
"annoyed",
"surprised",
"determined",
"console",
"glitch",
"lore",
"triumph"
],
"sheet_corner_std": [
2.6,
2.1
],
"min_cell_corner_greenness": 182,
"residual_green_px_per_cell": [
0,
0,
0,
0,
0,
0,
0,
0,
0,
0,
0,
0
],
"residual_total": 0
},
"eureka-r1a": {
"size": [
2368,
1776
],
"mode": "cols divider lines, rows divider lines",
"cells": 12,
"labels": [
"neutral",
"happy",
"amused",
"thinking",
"concerned",
"annoyed",
"surprised",
"determined",
"probe",
"inspect",
"report",
"hood"
],
"sheet_corner_std": [
1.8,
1.8
],
"min_cell_corner_greenness": 186,
"residual_green_px_per_cell": [
0,
0,
0,
0,
0,
0,
0,
0,
0,
0,
0,
0
],
"residual_total": 0
},
"eureka-r1b": {
"size": [
2368,
1776
],
"mode": "cols gutters, rows gutters",
"cells": 12,
"labels": [
"neutral",
"happy",
"amused",
"thinking",
"concerned",
"annoyed",
"surprised",
"determined",
"probe",
"inspect",
"report",
"hood"
],
"sheet_corner_std": [
1.8,
2.0
],
"min_cell_corner_greenness": 229,
"residual_green_px_per_cell": [
0,
0,
0,
0,
0,
0,
0,
0,
0,
0,
0,
0
],
"residual_total": 0
},
"void-r1a": {
"missing": true
},
"void-r1b": {
"size": [
2368,
1776
],
"mode": "cols gutters, rows gutters",
"cells": 16,
"labels": [
"c01",
"c02",
"c03",
"c04",
"c05",
"c06",
"c07",
"c08",
"c09",
"c10",
"c11",
"c12",
"c13",
"c14",
"c15",
"c16"
],
"sheet_corner_std": [
2.5,
2.1
],
"min_cell_corner_greenness": 218,
"residual_green_px_per_cell": [
0,
0,
0,
0,
0,
0,
0,
0,
0,
0,
0,
0,
0,
0,
0,
0
],
"residual_total": 0
}
}

View file

@ -0,0 +1,178 @@
"""Round 1: crop each 4x3 sheet into 12 cells, key each cell with the busts' matte rule (matte_r2.py, copied unchanged),
write cutouts to the originals folder and labelled contact images into the record folder.
Usage: py -3 matte_crop_r1.py [name-suf ...]
"""
import json, pathlib, sys
from PIL import Image, ImageChops, ImageFilter, ImageDraw, ImageFont, ImageStat
sys.path.insert(0, str(pathlib.Path(__file__).parent))
import render_r1 as R
ORIG = R.ORIG
REC = R.REC
LO, HI = 40, 110
TRIM = 6 # px trimmed from every cell edge (divider lines the model draws despite the prompt)
COLS, ROWS = 4, 3
# The model drew a 4x4 sheet (16 cells) for these two instead of the declared 4x3; cropped as drawn, labelled cNN.
GRID16 = {("aqua", "r1b"), ("void", "r1b")}
# ---- matte_r2.py rule, unchanged ----
def greenness(im):
r, g, b = im.split()
return ImageChops.subtract(g, ImageChops.lighter(r, b))
def matte(im):
im = im.convert("RGB")
w, h = im.size
gr = greenness(im)
corners = [gr.crop(box) for box in ((0, 0, 24, 24), (w - 24, 0, w, 24))]
cg = [ImageStat.Stat(c).mean[0] for c in corners]
span = 255.0 / (HI - LO)
a = gr.point(lambda v: 255 if v <= LO else (0 if v >= HI else int(255 - (v - LO) * span)))
band = ImageChops.subtract(a.filter(ImageFilter.MaxFilter(7)), a.filter(ImageFilter.MinFilter(7)))
band = band.point(lambda v: 255 if v > 0 else 0)
r, g, b = im.split()
g2 = Image.composite(ImageChops.darker(g, ImageChops.lighter(r, b)), g, band)
a = a.filter(ImageFilter.GaussianBlur(0.8))
out = Image.merge("RGBA", (r, g2, b, a))
std = [round(max(ImageStat.Stat(im.crop(bx)).stddev), 1) for bx in ((0, 0, 64, 64), (w - 64, 0, w, 64))]
resid = ImageChops.multiply(greenness(out.convert("RGB")).point(lambda v: 255 if v > 60 else 0), a.point(lambda v: 255 if v > 128 else 0))
rc = sum(resid.histogram()[255:])
return out, cg, std, rc
# ---- end of the busts' rule ----
def runs(profile, thin=8, gap=8):
"""Content runs of a 0/1 profile; runs thinner than `thin` are divider lines; runs closer than `gap` merge."""
out, i, n = [], 0, len(profile)
while i < n:
if profile[i]:
j = i
while j < n and profile[j]: j += 1
if j - i >= thin: out.append([i, j])
i = j
else:
i += 1
merged = []
for r in out:
if merged and r[0] - merged[-1][1] < gap: merged[-1][1] = r[1]
else: merged.append(r)
return merged
def profile(im, axis):
w, h = im.size
mask = greenness(im).point(lambda v: 255 if v < LO else 0) # non-ground
m = mask.resize((w, 1), Image.BOX) if axis == 0 else mask.resize((1, h), Image.BOX)
n = w if axis == 0 else h
return [m.getpixel((i, 0) if axis == 0 else (0, i)) / 255.0 for i in range(n)]
def splits(im, n, axis):
"""Per interior boundary (end of the earlier cell, start of the next cell) and the method used.
1) divider lines the model draws despite the prompt (thin, nearly full-length non-ground runs) near the nominal boundaries;
2) green gutters between content runs; 3) None."""
prof = profile(im, axis); size = len(prof)
nominal = [size * i // n for i in range(n + 1)]
tol = 0.10 * size / n
# 1) divider lines
lines, i = [], 0
while i < size:
if prof[i] > 0.80:
j = i
while j < size and prof[j] > 0.80: j += 1
if j - i <= 10: lines.append((i, j))
i = j
else: i += 1
got = []
for k in range(1, n):
c = [l for l in lines if abs((l[0] + l[1]) / 2 - nominal[k]) <= tol]
if len(c) != 1: got = None; break
got.append((c[0][0] - 5, c[0][1] + 5))
if got: return got, "divider lines"
# 2) gutters
rs = runs([1 if v > 0.03 else 0 for v in prof])
if len(rs) == n:
mid = [(rs[i][1] + rs[i + 1][0]) // 2 for i in range(n - 1)]
if all(abs(mid[k - 1] - nominal[k]) <= tol for k in range(1, n)):
return [(m - TRIM, m + TRIM) for m in mid], "gutters"
return None, f"runs {len(rs)}"
def font(sz):
for f in ("C:/Windows/Fonts/consola.ttf", "C:/Windows/Fonts/arial.ttf"):
try: return ImageFont.truetype(f, sz)
except OSError: pass
return ImageFont.load_default()
def grey_checker(size):
c = Image.new("RGB", size, (128, 128, 128)); d = ImageDraw.Draw(c); t = 16
for y in range(0, size[1], t):
for x in range((y // t % 2) * t, size[0], 2 * t):
d.rectangle([x, y, x + t - 1, y + t - 1], fill=(142, 142, 142))
return c
def grid(cuts, labels, cw, pad, lab, title=None, ch=None):
ch = ch or cw
rows = (len(cuts) + COLS - 1) // COLS
W = COLS * cw + (COLS + 1) * pad
H = (title or 0) + rows * (ch + lab) + (rows + 1) * pad
g = grey_checker((W, H)); d = ImageDraw.Draw(g); f = font(max(11, lab - 6))
for i, c in enumerate(cuts):
x = pad + (i % COLS) * (cw + pad); y = (title or 0) + pad + (i // COLS) * (ch + lab + pad)
t = c.resize((cw, ch), Image.LANCZOS); g.paste(t, (x, y + lab), t)
d.text((x + 2, y + 2), labels[i], fill=(10, 10, 10), font=f)
return g
def process(name, suf, log):
src = ORIG / name / f"{name}-{suf}.png"
if not src.exists():
log[f"{name}-{suf}"] = {"missing": True}; return None
im = Image.open(src).convert("RGB")
w, h = im.size
nrows = 4 if (name, suf) in GRID16 else ROWS
sx, mx = splits(im, COLS, 0); sy, my = splits(im, nrows, 1)
mode = f"cols {mx}, rows {my}"
if sx is None: mode += "; cols fell back to the nominal grid"; sx = [(w * i // COLS - TRIM, w * i // COLS + TRIM) for i in range(1, COLS)]
if sy is None: mode += "; rows fell back to the nominal grid"; sy = [(h * i // nrows - TRIM, h * i // nrows + TRIM) for i in range(1, nrows)]
x0 = [TRIM] + [e for _, e in sx]; x1 = [a for a, _ in sx] + [w - TRIM]
y0 = [TRIM] + [e for _, e in sy]; y1 = [a for a, _ in sy] + [h - TRIM]
labels = [l for l, _ in R.cells_for(name)] if nrows == ROWS else [f"c{i + 1:02d}" for i in range(COLS * nrows)]
outd = ORIG / name / f"{name}-{suf}-cells"; outd.mkdir(exist_ok=True)
cuts, rcs, cgs = [], [], []
for i, lab in enumerate(labels):
c, r = i % COLS, i // COLS
cell = im.crop((x0[c], y0[r], x1[c], y1[r]))
out, cg, std, rc = matte(cell)
out.save(outd / f"{i + 1:02d}-{lab}.png", optimize=True)
cuts.append(out); rcs.append(rc); cgs.append(round(min(cg)))
# sheet ground flatness: std of the two top corners of the whole sheet
sstd = [round(max(ImageStat.Stat(im.crop(bx)).stddev), 1) for bx in ((0, 0, 64, 64), (w - 64, 0, w, 64))]
g = grid(cuts, [f"{i + 1} {l}" for i, l in enumerate(labels)], 380, 10, 24)
g.save(REC / name / f"{name}-{suf}.webp", "WEBP", quality=88, method=6)
log[f"{name}-{suf}"] = {"size": [w, h], "mode": mode, "cells": len(cuts), "labels": labels,
"sheet_corner_std": sstd, "min_cell_corner_greenness": min(cgs),
"residual_green_px_per_cell": rcs, "residual_total": sum(rcs)}
print(name, suf, mode, "cells", len(cuts), "corner std", sstd, "residual", sum(rcs), flush=True)
return cuts
def contact(all_cuts):
tw, th = 600, 476
order = [(n, s) for n in R.NAMES for s in ("r1a", "r1b")]
W = 4 * tw; H = ((len(order) + 3) // 4) * th
big = Image.new("RGB", (W, H), (60, 60, 60)); d = ImageDraw.Draw(big); f = font(16)
for k, key in enumerate(order):
x, y = (k % 4) * tw, (k // 4) * th
cuts = all_cuts.get(key)
d.text((x + 8, y + 3), f"{key[0]} {key[1]}", fill=(255, 255, 255), font=f)
if not cuts: continue
g = grid(cuts, [""] * len(cuts), 140 if len(cuts) == 12 else 105, 6, 0)
big.paste(g, (x + 5, y + 22))
big.save(REC / "contact-r1.webp", "WEBP", quality=88, method=6)
print("contact-r1.webp", big.size)
if __name__ == "__main__":
only = sys.argv[1:]
log, all_cuts = {}, {}
for n in R.NAMES:
for s in ("r1a", "r1b"):
if only and f"{n}-{s}" not in only: continue
all_cuts[(n, s)] = process(n, s, log)
if not only:
contact(all_cuts)
(REC / "matte-crop-log.json").write_text(json.dumps(log, indent=1), encoding="utf-8")

View file

@ -0,0 +1,30 @@
# Nibu r1a
## Hypothesis
A sheet keeps the character consistent across twelve cells from the prompt alone: the busts' shared style block adapted for a sheet, the canon character block verbatim, and twelve short cell descriptions.
## Variable changed
Baseline: prompt only, no reference image.
## Render record
- Model: FLUX 3 Image, `POST https://api.bfl.ai/v1/flux-3-image`
- Parameters: aspect_ratio 4:3, resolution 2k, safety_tolerance default, grounding default; no seed field
- Reference: none; rendered from scratch from the prompt alone
- Output: 2368x1776, source format PNG; 2k original kept out of git at F:/Projects/cast-art-originals/poses-r1/nibu/nibu-r1a.png
- Cost: about $0.10 per request (reported by API: {'cost': 10.0, 'input_mp': None, 'output_mp': None})
- Request id: dfd3ec40-64d3-4f2a-8dc1-e22bb7392d96
- Date: 2026-10-14
- Cell order: neutral, happy, amused, thinking, concerned, annoyed, surprised, determined, console, glitch, lore, triumph
## Prompt
Character expression sheet for a game cast lineup: a sheet of twelve cells, each cell a bust, head and shoulders cropped at mid-chest by the bottom edge of the cell, the character in three-quarter view turned toward the right side of the cell, the head centred horizontally in the cell with its top a small margin below the top edge of the cell, the same crop and scale in every cell. Super-deformed chibi proportions: the character is two heads tall in total, so the head is very large compared with the small shoulders and narrow torso. Clean 2D anime illustration drawn to be traced into vector art: one bold dark outline of even weight around the whole silhouette, thinner inner lines, flat cel shading with exactly one base tone and one shadow tone per material, light from the upper left. No gradients, no texture, no painterly blending, no glow halos, no pixel art, no 3D rendering. A limited palette of five or six flat colours taken from the character's key colours. Large expressive anime eyes with two white highlights. The background is one perfectly flat, uniform, solid bright chroma-key green from edge to edge: no gradient, no vignette, no floor, no cast shadow, no particles, no props or scenery behind the figure.
The sheet is a grid of four columns by three rows, twelve cells of the same character in reading order, left to right and top to bottom, separated by generous empty padding of the same flat green, with no frames, no borders, no divider lines, no labels and no text. Every cell shows the same character with the same design, colours and proportions; the cell description sets that cell's expression and pose, and the character description below gives the design.
Nibu, a quiet, serious worldbuilder girl: very long pale lavender hair with a swept side fringe, a pink hair clip on the left shaped like a small data connector plug, a short rectangular plug body with a round pink bead at each end; a large pink ribbon bow on the right, half-lidded violet eyes, a calm unsmiling expression, arms folded. Wears a sleeveless lilac blouse with a frilled collar, detached dark purple sleeves with circuit-pattern embroidery, a small cyan ring device on the shoulder, and a long dark purple coat. Key colours: violet and pink with a cyan accent.
Cell 1 (neutral): a calm neutral expression, mouth closed, looking ahead. Cell 2 (happy): a broad happy smile with bright eyes. Cell 3 (amused): an amused smirk with one eyebrow raised, a stifled laugh. Cell 4 (thinking): a thoughtful expression, eyes looking up and aside, one hand raised to the chin. Cell 5 (concerned): a concerned expression, brows drawn together and tilted up, a small worried frown. Cell 6 (annoyed): an annoyed expression, flat half-lidded eyes, a pursed frown. Cell 7 (surprised): a surprised expression, wide eyes, mouth open in an O. Cell 8 (determined): a determined expression, narrowed eyes, a firm set mouth, a small nod. Cell 9 (console): typing on a small floating console panel. Cell 10 (glitch): her face and hair split by a few horizontally offset slices, as if glitching. Cell 11 (lore): reciting lore with eyes closed and one hand open before her. Cell 12 (triumph): a quiet triumphant smile with one fist lightly raised.

Binary file not shown.

After

Width:  |  Height:  |  Size: 276 KiB

View file

@ -0,0 +1,32 @@
# Nibu r1b
## Hypothesis
Adding the canon bust as a reference image holds canon details the prompt alone drifts on, without pulling every cell into the bust's pose.
## Variable changed
Against the same character's r1a: the canon bust cutout on its chroma green is passed as `images` and cited as image 1 by one clause prepended to the prompt. Nothing else differs.
## Render record
- Model: FLUX 3 Image, `POST https://api.bfl.ai/v1/flux-3-image`
- Parameters: aspect_ratio 4:3, resolution 2k, safety_tolerance default, grounding default; no seed field
- Reference: canon bust r3/nibu/nibu-r3a-cutout.png composited on its chroma green, base64 in `images`, cited as image 1; reference ground rgb(39, 245, 72)
- Output: 2368x1776, source format PNG; 2k original kept out of git at F:/Projects/cast-art-originals/poses-r1/nibu/nibu-r1b.png
- Cost: about $0.10 per request (reported by API: {'cost': 10.0, 'input_mp': None, 'output_mp': None})
- Request id: fb227513-5308-40dd-8fe9-56a474ef2155
- Date: 2026-10-14
- Cell order: neutral, happy, amused, thinking, concerned, annoyed, surprised, determined, console, glitch, lore, triumph
## Prompt
Image 1 is the character's canon bust. The character must look exactly like the character in image 1 (same design, colours, proportions and line style) in every cell.
Character expression sheet for a game cast lineup: a sheet of twelve cells, each cell a bust, head and shoulders cropped at mid-chest by the bottom edge of the cell, the character in three-quarter view turned toward the right side of the cell, the head centred horizontally in the cell with its top a small margin below the top edge of the cell, the same crop and scale in every cell. Super-deformed chibi proportions: the character is two heads tall in total, so the head is very large compared with the small shoulders and narrow torso. Clean 2D anime illustration drawn to be traced into vector art: one bold dark outline of even weight around the whole silhouette, thinner inner lines, flat cel shading with exactly one base tone and one shadow tone per material, light from the upper left. No gradients, no texture, no painterly blending, no glow halos, no pixel art, no 3D rendering. A limited palette of five or six flat colours taken from the character's key colours. Large expressive anime eyes with two white highlights. The background is one perfectly flat, uniform, solid bright chroma-key green from edge to edge: no gradient, no vignette, no floor, no cast shadow, no particles, no props or scenery behind the figure.
The sheet is a grid of four columns by three rows, twelve cells of the same character in reading order, left to right and top to bottom, separated by generous empty padding of the same flat green, with no frames, no borders, no divider lines, no labels and no text. Every cell shows the same character with the same design, colours and proportions; the cell description sets that cell's expression and pose, and the character description below gives the design.
Nibu, a quiet, serious worldbuilder girl: very long pale lavender hair with a swept side fringe, a pink hair clip on the left shaped like a small data connector plug, a short rectangular plug body with a round pink bead at each end; a large pink ribbon bow on the right, half-lidded violet eyes, a calm unsmiling expression, arms folded. Wears a sleeveless lilac blouse with a frilled collar, detached dark purple sleeves with circuit-pattern embroidery, a small cyan ring device on the shoulder, and a long dark purple coat. Key colours: violet and pink with a cyan accent.
Cell 1 (neutral): a calm neutral expression, mouth closed, looking ahead. Cell 2 (happy): a broad happy smile with bright eyes. Cell 3 (amused): an amused smirk with one eyebrow raised, a stifled laugh. Cell 4 (thinking): a thoughtful expression, eyes looking up and aside, one hand raised to the chin. Cell 5 (concerned): a concerned expression, brows drawn together and tilted up, a small worried frown. Cell 6 (annoyed): an annoyed expression, flat half-lidded eyes, a pursed frown. Cell 7 (surprised): a surprised expression, wide eyes, mouth open in an O. Cell 8 (determined): a determined expression, narrowed eyes, a firm set mouth, a small nod. Cell 9 (console): typing on a small floating console panel. Cell 10 (glitch): her face and hair split by a few horizontally offset slices, as if glitching. Cell 11 (lore): reciting lore with eyes closed and one hand open before her. Cell 12 (triumph): a quiet triumphant smile with one fist lightly raised.

Binary file not shown.

After

Width:  |  Height:  |  Size: 282 KiB

View file

@ -0,0 +1,197 @@
"""Round 1 pose sheets. Key read from F:/Projects/bfl-api.txt inside this process only; never printed, logged or written.
Per-character blocks are taken verbatim from the canon bust records (the .txt beside each canon render),
not retyped. Usage: py -3 render_r1.py [libby-r1a ...] (no args = all 16)
"""
import json, time, urllib.request, urllib.error, urllib.parse, io, sys, datetime, pathlib, base64, concurrent.futures as cf
from PIL import Image
CANON = pathlib.Path(r"F:/Projects/gamecult-site-wt-portraits/cast-portraits")
REC = pathlib.Path(__file__).parent
ORIG = pathlib.Path(r"F:/Projects/cast-art-originals/poses-r1")
ENDPOINT = "https://api.bfl.ai/v1/flux-3-image"
NAMES = ["libby", "heimdall", "kiko", "aqua", "weksa", "nibu", "eureka", "void"]
BUST = {"libby": "r2/libby/libby-r2a", "heimdall": "r2/heimdall/heimdall-r2a", "kiko": "r2/kiko/kiko-r2a",
"aqua": "r4/aqua/aqua-r4a", "weksa": "r2/weksa/weksa-r2a", "nibu": "r3/nibu/nibu-r3a",
"eureka": "r2/eureka/eureka-r2a", "void": "r3/void/void-r3a"}
BUST_ORIG = {"libby": "r2/libby-r2a", "heimdall": "r2/heimdall-r2a", "kiko": "r2/kiko-r2a", "aqua": "r4/aqua-r4a",
"weksa": "r2/weksa-r2a", "nibu": "r3/nibu-r3a", "eureka": "r2/eureka-r2a", "void": "r3/void-r3a"}
# The busts' batch-A shared style block (two heads tall), exactly as the canon records carry it.
STYLE_BUST = (
"Character portrait for a game cast lineup: a bust, head and shoulders cropped at mid-chest by the bottom edge of the frame, "
"the character in three-quarter view turned toward the right side of the frame, the head centred horizontally with its top a small margin "
"below the top edge, the same crop and scale for every character. "
"Super-deformed chibi proportions: the character is two heads tall in total, so the head is very large compared with the small shoulders and narrow torso. "
"Clean 2D anime illustration drawn to be traced into vector art: one bold dark outline of even weight around the whole silhouette, "
"thinner inner lines, flat cel shading with exactly one base tone and one shadow tone per material, light from the upper left. "
"No gradients, no texture, no painterly blending, no glow halos, no pixel art, no 3D rendering. "
"A limited palette of five or six flat colours taken from the character's key colours. Large expressive anime eyes with two white highlights. "
"The background is one perfectly flat, uniform, solid bright chroma-key green from edge to edge: no gradient, no vignette, no floor, "
"no cast shadow, no particles, no props or scenery behind the figure."
)
CROP_BUST = ("a bust, head and shoulders cropped at mid-chest by the bottom edge of the frame, "
"the character in three-quarter view turned toward the right side of the frame, the head centred horizontally with its top a small margin "
"below the top edge, the same crop and scale for every character. ")
CROP_SHEET = ("a sheet of twelve cells, each cell a bust, head and shoulders cropped at mid-chest by the bottom edge of the cell, "
"the character in three-quarter view turned toward the right side of the cell, the head centred horizontally in the cell with its top a small margin "
"below the top edge of the cell, the same crop and scale in every cell. ")
STYLE = STYLE_BUST.replace("Character portrait for a game cast lineup: " + CROP_BUST, "Character expression sheet for a game cast lineup: " + CROP_SHEET)
assert STYLE != STYLE_BUST and "twelve cells" in STYLE
SHEET = ("The sheet is a grid of four columns by three rows, twelve cells of the same character in reading order, left to right and top to bottom, "
"separated by generous empty padding of the same flat green, with no frames, no borders, no divider lines, no labels and no text. "
"Every cell shows the same character with the same design, colours and proportions; the cell description sets that cell's expression and pose, "
"and the character description below gives the design.")
REF = ("Image 1 is the character's canon bust. The character must look exactly like the character in image 1 "
"(same design, colours, proportions and line style) in every cell.")
CORE = [("neutral", "a calm neutral expression, mouth closed, looking ahead"),
("happy", "a broad happy smile with bright eyes"),
("amused", "an amused smirk with one eyebrow raised, a stifled laugh"),
("thinking", "a thoughtful expression, eyes looking up and aside, one hand raised to the chin"),
("concerned", "a concerned expression, brows drawn together and tilted up, a small worried frown"),
("annoyed", "an annoyed expression, flat half-lidded eyes, a pursed frown"),
("surprised", "a surprised expression, wide eyes, mouth open in an O"),
("determined", "a determined expression, narrowed eyes, a firm set mouth, a small nod")]
SIG = {
"libby": [("stamp", "stamping a library due-date stamp down onto a book with a cheerful thump"),
("research", "peering closely at an open old book held in both hands"),
("shush", "one finger raised to her lips in a shushing gesture"),
("schema", "holding up a glowing violet diagram of boxes and arrows, explaining")],
"heimdall": [("badge", "holding up a gold badge of authority toward the viewer"),
("barrier", "one palm raised forward, projecting a blue barrier"),
("protect", "stepping forward with his cape swept out in front, shielding someone behind him"),
("revoke", "pointing the golden key downward with a sharp cross-out gesture of the other hand, revoking access")],
"kiko": [("tinker", "tinkering with a small gadget, tongue out in concentration"),
("confetti", "throwing confetti into the air, cheering"),
("sprint", "leaning forward as if sprinting, hair and tail streaming backward"),
("debug", "squinting through a magnifying lens at a tiny bug held between two fingers")],
"aqua": [("conduct", "conducting with a raised pectoral fin like a baton"),
("listen", "one fin pressed to a headphone ear cup, eyes closed, listening"),
("patch", "plugging a cyan patch cable into a jack"),
("flourish", "a showy DJ flourish with both fins spread wide")],
"weksa": [("map", "unrolling a map scroll and studying it"),
("fieldwork", "brushing dust off a small relic with a soft brush"),
("argue", "arguing, one finger jabbed forward, mouth open mid-sentence"),
("interlingua", "holding two glyph cards side by side, comparing their meanings")],
"nibu": [("console", "typing on a small floating console panel"),
("glitch", "her face and hair split by a few horizontally offset slices, as if glitching"),
("lore", "reciting lore with eyes closed and one hand open before her"),
("triumph", "a quiet triumphant smile with one fist lightly raised")],
"eureka": [("probe", "pointing the orange probe forward"),
("inspect", "leaning in with narrowed eyes to inspect something closely"),
("report", "presenting a thin tablet showing a report"),
("hood", "the hood pulled low, shadowing her eyes, only a knowing smirk visible")],
"void": [("welcome", "arms opened wide in welcome"),
("document", "holding up a sheet of paper, a document"),
("point", "pointing one gloved finger forward"),
("unimpressed", "unimpressed, the eyes flat narrow slits, the head tilted")],
}
VOID_CORE = [("neutral", "a calm neutral look, the two tall white oval eyes at rest"),
("happy", "happy, the white eyes curved into bright upturned crescents"),
("amused", "amused, one white eye narrower than the other, the hood tilted slightly"),
("thinking", "thoughtful, the white eyes looking up and aside, one gloved hand raised to the hood"),
("concerned", "concerned, the white eyes tilted inward and upward, the hood drooping slightly"),
("annoyed", "annoyed, the white eyes flat half-closed slits"),
("surprised", "surprised, the white eyes wide round circles, the hood rising"),
("determined", "determined, the white eyes narrowed and angled inward, the hood set forward")]
def cells_for(n):
return (VOID_CORE if n == "void" else CORE) + SIG[n]
def canon_block(n):
t = (CANON / (BUST[n] + ".txt")).read_text(encoding="utf-8").replace("\r\n", "\n")
body = t.split("## Prompt\n\n", 1)[1].strip()
style, block = body.split("\n\n", 1)
assert style == STYLE_BUST, f"{n}: canon style block differs from batch A"
return block.strip()
def prompt_for(n, suf):
cells = " ".join(f"Cell {i + 1} ({l}): {d}." for i, (l, d) in enumerate(cells_for(n)))
p = STYLE + "\n\n" + SHEET + "\n\n" + canon_block(n) + "\n\n" + cells
return (REF + "\n\n" + p) if suf == "r1b" else p
def ref_image(n):
cut = Image.open(CANON / (BUST[n] + "-cutout.png")).convert("RGBA")
o = Image.open(pathlib.Path(r"F:/Projects/cast-art-originals") / (BUST_ORIG[n] + ".png")).convert("RGB")
px = [o.getpixel(p) for p in ((4, 4), (o.width - 5, 4))]
g = tuple(sum(c[i] for c in px) // 2 for i in range(3))
bg = Image.new("RGB", cut.size, g); bg.paste(cut, (0, 0), cut)
b = io.BytesIO(); bg.save(b, "PNG")
return base64.b64encode(b.getvalue()).decode(), g
HYP = {"r1a": "A sheet keeps the character consistent across twelve cells from the prompt alone: the busts' shared style block adapted for a sheet, the canon character block verbatim, and twelve short cell descriptions.",
"r1b": "Adding the canon bust as a reference image holds canon details the prompt alone drifts on, without pulling every cell into the bust's pose."}
VAR = {"r1a": "Baseline: prompt only, no reference image.",
"r1b": "Against the same character's r1a: the canon bust cutout on its chroma green is passed as `images` and cited as image 1 by one clause prepended to the prompt. Nothing else differs."}
def req(url, key, data=None):
r = urllib.request.Request(url, data=json.dumps(data).encode() if data else None,
headers={"x-key": key, "Content-Type": "application/json", "accept": "application/json"})
return json.load(urllib.request.urlopen(r, timeout=60))
def run(job, key):
n, suf = job
d = REC / n; d.mkdir(parents=True, exist_ok=True); ORIG.joinpath(n).mkdir(parents=True, exist_ok=True)
png = ORIG / n / f"{n}-{suf}.png"
if png.exists():
return f"{n}-{suf}: exists, skipped"
prompt = prompt_for(n, suf)
body = {"prompt": prompt, "aspect_ratio": "4:3", "resolution": "2k"}
gdesc = ""
if suf == "r1b":
b64, g = ref_image(n); body["images"] = [b64]; gdesc = f"; reference ground rgb{g}"
try:
j = req(ENDPOINT, key, body)
except urllib.error.HTTPError as e:
return f"{n}-{suf}: submit HTTP {e.code} {e.read()[:400]!r}"
except Exception as e:
return f"{n}-{suf}: submit transport error {type(e).__name__}"
rid, poll = j.get("id"), j.get("polling_url")
cost = {k: j[k] for k in ("cost", "input_mp", "output_mp") if k in j}
print(f"{n}-{suf}: submitted id {rid} poll host {urllib.parse.urlparse(poll or '').netloc} {cost}", flush=True)
last = None
for i in range(300):
time.sleep(6)
try: s = req(poll, key)
except Exception as e:
m = f"poll error {type(e).__name__} {getattr(e, 'code', '')}"
if getattr(e, "code", 0) == 500:
return f"{n}-{suf}: server-side error (HTTP 500) id {rid}"
if m != last: print(f"{n}-{suf}: {m}", flush=True); last = m
continue
st = s.get("status")
if st != last: print(f"{n}-{suf}: status {st} at {i * 6}s", flush=True); last = st
if st == "Ready":
raw = urllib.request.urlopen(s["result"]["sample"], timeout=120).read()
im = Image.open(io.BytesIO(raw)); fmt = im.format; im.save(png, "PNG")
ref = (f"- Reference: canon bust {BUST[n]}-cutout.png composited on its chroma green, base64 in `images`, cited as image 1{gdesc}\n"
if suf == "r1b" else "- Reference: none; rendered from scratch from the prompt alone\n")
txt = (f"# {n.capitalize()} {suf}\n\n## Hypothesis\n\n{HYP[suf]}\n\n## Variable changed\n\n{VAR[suf]}\n\n"
f"## Render record\n\n- Model: FLUX 3 Image, `POST {ENDPOINT}`\n"
f"- Parameters: aspect_ratio 4:3, resolution 2k, safety_tolerance default, grounding default; no seed field\n{ref}"
f"- Output: {im.size[0]}x{im.size[1]}, source format {fmt}; 2k original kept out of git at "
f"F:/Projects/cast-art-originals/poses-r1/{n}/{n}-{suf}.png\n"
f"- Cost: about $0.10 per request (reported by API: {cost or 'nothing'})\n"
f"- Request id: {rid}\n- Date: {datetime.date.today().isoformat()}\n"
f"- Cell order: {', '.join(l for l, _ in cells_for(n))}\n\n"
f"## Prompt\n\n{prompt}\n")
(d / f"{n}-{suf}.txt").write_text(txt, encoding="utf-8")
return f"{n}-{suf}: Ready {im.size} id {rid}"
if st in ("Error", "Failed", "Content Moderated", "Request Moderated", "Task not found"):
return f"{n}-{suf}: {st} {str(s)[:200]}"
return f"{n}-{suf}: timeout id {rid}"
if __name__ == "__main__":
only = sys.argv[1:]
if only == ["--dry"]:
for n in NAMES:
for s in ("r1a", "r1b"):
p = prompt_for(n, s); print(n, s, len(p))
print(prompt_for("void", "r1b")); sys.exit()
key = pathlib.Path(r"F:/Projects/bfl-api.txt").read_text().strip()
jobs = [(n, s) for n in NAMES for s in ("r1a", "r1b") if not only or f"{n}-{s}" in only]
with cf.ThreadPoolExecutor(max_workers=int(__import__("os").environ.get("WORKERS", "4"))) as ex:
for r in ex.map(lambda j: run(j, key), jobs):
print(r, flush=True)
print("DONE", flush=True)

View file

@ -0,0 +1,118 @@
# Round 1 request log (key-free). Order: first libby-r1b attempt, its retry, the 15-job run, kiko-r1b retry, the serial run of the rest, then checks.
## probe.log
libby-r1b: timeout id 936bb7bb-48f3-4770-836e-8e02e19892ea
DONE
## probe2.log
libby-r1b: submitted id a4b50eab-abda-4021-8f08-8aa81c894a05 poll host api.isr.bfl.ai {'cost': 10.0, 'input_mp': None, 'output_mp': None}
libby-r1b: status Reasoning at 0s
libby-r1b: status Generating at 18s
libby-r1b: status Ready at 30s
libby-r1b: Ready (2368, 1776) id a4b50eab-abda-4021-8f08-8aa81c894a05
DONE
## run.log
kiko-r1a: submitted id 2414b18b-bda2-4f88-bcad-f060fa52965a poll host api.isr.bfl.ai {'cost': 10.0, 'input_mp': None, 'output_mp': None}
heimdall-r1a: submitted id a051f0ca-f250-4aa8-a47f-c5195dbe94bc poll host api.isr.bfl.ai {'cost': 10.0, 'input_mp': None, 'output_mp': None}
libby-r1a: submitted id b12cd042-63fc-4e99-85af-a239f60ec937 poll host api.us8.bfl.ai {'cost': 10.0, 'input_mp': None, 'output_mp': None}
kiko-r1b: submitted id 419a1e26-f247-4a31-b61c-6265457a22d4 poll host api.us6.bfl.ai {'cost': 10.0, 'input_mp': None, 'output_mp': None}
heimdall-r1a: status Reasoning at 0s
kiko-r1a: status Reasoning at 0s
libby-r1a: status Reasoning at 0s
kiko-r1b: status Reasoning at 0s
libby-r1a: status Generating at 18s
kiko-r1b: poll error HTTPError 500
kiko-r1a: status Generating at 24s
kiko-r1a: status Ready at 30s
heimdall-r1a: status Generating at 30s
libby-r1a: status Ready at 30s
libby-r1a: Ready (2368, 1776) id b12cd042-63fc-4e99-85af-a239f60ec937
libby-r1b: exists, skipped
weksa-r1b: submitted id 044ad25e-87c2-4c79-9c84-28b355501f78 poll host api.us6.bfl.ai {'cost': 10.0, 'input_mp': None, 'output_mp': None}
heimdall-r1a: status Ready at 36s
nibu-r1a: submitted id dfd3ec40-64d3-4f2a-8dc1-e22bb7392d96 poll host api.us2.bfl.ai {'cost': 10.0, 'input_mp': None, 'output_mp': None}
heimdall-r1a: Ready (2368, 1776) id a051f0ca-f250-4aa8-a47f-c5195dbe94bc
heimdall-r1b: submit HTTP 429 b'{"detail":"Credit balance low: active tasks are capped at 1 per organization. Please top up to restore full throughput."}'
kiko-r1a: Ready (2368, 1776) id 2414b18b-bda2-4f88-bcad-f060fa52965a
nibu-r1b: submitted id fb227513-5308-40dd-8fe9-56a474ef2155 poll host api.isr.bfl.ai {'cost': 10.0, 'input_mp': None, 'output_mp': None}
weksa-r1b: status Reasoning at 0s
nibu-r1a: status Reasoning at 0s
nibu-r1b: status Reasoning at 0s
weksa-r1b: poll error HTTPError 500
nibu-r1a: status Generating at 18s
nibu-r1b: status Generating at 18s
nibu-r1b: status Ready at 30s
eureka-r1a: submitted id cffa8610-5235-4df0-bb0c-91d37e5146f2 poll host api.isr.bfl.ai {'cost': 10.0, 'input_mp': None, 'output_mp': None}
nibu-r1a: status Ready at 36s
eureka-r1a: status Reasoning at 0s
eureka-r1b: submitted id 63328793-f3e5-4dab-9e98-cefb2d5e1f9a poll host api.us2.bfl.ai {'cost': 10.0, 'input_mp': None, 'output_mp': None}
eureka-r1b: status Reasoning at 0s
eureka-r1a: status Generating at 18s
eureka-r1b: status Generating at 18s
eureka-r1a: status Ready at 30s
void-r1b: submitted id 83206362-d1b5-4e1d-ac42-123edea8dadb poll host api.isr.bfl.ai {'cost': 10.0, 'input_mp': None, 'output_mp': None}
void-r1b: status Reasoning at 0s
void-r1b: status Generating at 12s
eureka-r1b: status Ready at 54s
void-r1b: status Ready at 24s
## retry-kiko-r1b.log
kiko-r1b: submitted id 15e7b364-1771-4136-9532-c5b012524609 poll host api.us7.bfl.ai {'cost': 10.0, 'input_mp': None, 'output_mp': None}
kiko-r1b: status Reasoning at 0s
kiko-r1b: status Generating at 18s
kiko-r1b: status Ready at 30s
kiko-r1b: Ready (2368, 1776) id 15e7b364-1771-4136-9532-c5b012524609
DONE
## run2.log
heimdall-r1b: submitted id 68ecec4c-3301-458d-8ae2-b7171ae8fbb0 poll host api.isr.bfl.ai {'cost': 10.0, 'input_mp': None, 'output_mp': None}
heimdall-r1b: status Reasoning at 0s
heimdall-r1b: status Generating at 12s
heimdall-r1b: status Ready at 30s
heimdall-r1b: Ready (2368, 1776) id 68ecec4c-3301-458d-8ae2-b7171ae8fbb0
aqua-r1a: submitted id 5036c049-cac8-48df-9cc6-bc01805b4d26 poll host api.us7.bfl.ai {'cost': 10.0, 'input_mp': None, 'output_mp': None}
aqua-r1a: status Reasoning at 0s
aqua-r1a: status Generating at 18s
aqua-r1a: status Ready at 30s
aqua-r1a: Ready (2368, 1776) id 5036c049-cac8-48df-9cc6-bc01805b4d26
aqua-r1b: submitted id 8dc4c2ff-0245-41de-9991-8055a309c852 poll host api.us6.bfl.ai {'cost': 10.0, 'input_mp': None, 'output_mp': None}
aqua-r1b: status Reasoning at 0s
aqua-r1b: status Generating at 18s
aqua-r1b: status Ready at 60s
aqua-r1b: Ready (2368, 1776) id 8dc4c2ff-0245-41de-9991-8055a309c852
weksa-r1a: submitted id 96f45121-c6c8-4a54-b6c7-15a98978722d poll host api.us2.bfl.ai {'cost': 10.0, 'input_mp': None, 'output_mp': None}
weksa-r1a: status Reasoning at 0s
weksa-r1a: status Generating at 24s
weksa-r1a: status Ready at 42s
weksa-r1a: Ready (2368, 1776) id 96f45121-c6c8-4a54-b6c7-15a98978722d
void-r1a: submitted id 30a333e2-db14-4610-b749-26dadbe5d187 poll host api.us6.bfl.ai {'cost': 10.0, 'input_mp': None, 'output_mp': None}
void-r1a: status Reasoning at 0s
void-r1a: server-side error (HTTP 500) id 30a333e2-db14-4610-b749-26dadbe5d187
DONE
## check.log
not rendered, no record: weksa-r1b
not rendered, no record: void-r1a
prompts: 14 records match the script; shared style+sheet part identical across all; r1b == r1a + clause where both exist
core cell text identical for 7 characters, void adapted: True
aqua-r1a: 12 cutouts, order ok, mode cols gutters, rows gutters, residual green px 0, sheet corner std [2.3, 2.1]
aqua-r1b: CELL COUNT FAIL, 16 cutouts (4x4 sheet drawn), declared 12; residual green px 0
eureka-r1a: 12 cutouts, order ok, mode cols divider lines, rows divider lines, residual green px 0, sheet corner std [1.8, 1.8]
eureka-r1b: 12 cutouts, order ok, mode cols gutters, rows gutters, residual green px 0, sheet corner std [1.8, 2.0]
heimdall-r1a: 12 cutouts, order ok, mode cols divider lines, rows divider lines, residual green px 0, sheet corner std [2.1, 2.0]
heimdall-r1b: 12 cutouts, order ok, mode cols gutters, rows gutters, residual green px 0, sheet corner std [2.5, 2.1]
kiko-r1a: 12 cutouts, order ok, mode cols runs 5, rows gutters; cols fell back to the nominal grid, residual green px 0, sheet corner std [2.4, 2.6]
kiko-r1b: 12 cutouts, order ok, mode cols gutters, rows gutters, residual green px 0, sheet corner std [2.0, 2.2]
libby-r1a: 12 cutouts, order ok, mode cols gutters, rows gutters, residual green px 0, sheet corner std [2.1, 1.7]
libby-r1b: 12 cutouts, order ok, mode cols divider lines, rows divider lines, residual green px 0, sheet corner std [2.0, 1.9]
nibu-r1a: 12 cutouts, order ok, mode cols gutters, rows gutters, residual green px 0, sheet corner std [2.9, 2.4]
nibu-r1b: 12 cutouts, order ok, mode cols runs 5, rows gutters; cols fell back to the nominal grid, residual green px 0, sheet corner std [2.6, 2.1]
void-r1a: not rendered, no sheet
void-r1b: CELL COUNT FAIL, 16 cutouts (4x4 sheet drawn), declared 12; residual green px 0
weksa-r1a: 12 cutouts, order ok, mode cols divider lines, rows divider lines, residual green px 0, sheet corner std [1.9, 1.9]
weksa-r1b: not rendered, no sheet
committed-tree files over 2 MB: none
files containing the key value: none
cell-count failures: ['aqua-r1b', 'void-r1b']
ALL OK except the cell-count failures above

View file

@ -0,0 +1,32 @@
# Void r1b
## Hypothesis
Adding the canon bust as a reference image holds canon details the prompt alone drifts on, without pulling every cell into the bust's pose.
## Variable changed
Against the same character's r1a: the canon bust cutout on its chroma green is passed as `images` and cited as image 1 by one clause prepended to the prompt. Nothing else differs.
## Render record
- Model: FLUX 3 Image, `POST https://api.bfl.ai/v1/flux-3-image`
- Parameters: aspect_ratio 4:3, resolution 2k, safety_tolerance default, grounding default; no seed field
- Reference: canon bust r3/void/void-r3a-cutout.png composited on its chroma green, base64 in `images`, cited as image 1; reference ground rgb(33, 255, 30)
- Output: 2368x1776, source format PNG; 2k original kept out of git at F:/Projects/cast-art-originals/poses-r1/void/void-r1b.png
- Cost: about $0.10 per request (reported by API: {'cost': 10.0, 'input_mp': None, 'output_mp': None})
- Request id: 83206362-d1b5-4e1d-ac42-123edea8dadb
- Date: 2026-10-14
- Cell order: neutral, happy, amused, thinking, concerned, annoyed, surprised, determined, welcome, document, point, unimpressed
## Prompt
Image 1 is the character's canon bust. The character must look exactly like the character in image 1 (same design, colours, proportions and line style) in every cell.
Character expression sheet for a game cast lineup: a sheet of twelve cells, each cell a bust, head and shoulders cropped at mid-chest by the bottom edge of the cell, the character in three-quarter view turned toward the right side of the cell, the head centred horizontally in the cell with its top a small margin below the top edge of the cell, the same crop and scale in every cell. Super-deformed chibi proportions: the character is two heads tall in total, so the head is very large compared with the small shoulders and narrow torso. Clean 2D anime illustration drawn to be traced into vector art: one bold dark outline of even weight around the whole silhouette, thinner inner lines, flat cel shading with exactly one base tone and one shadow tone per material, light from the upper left. No gradients, no texture, no painterly blending, no glow halos, no pixel art, no 3D rendering. A limited palette of five or six flat colours taken from the character's key colours. Large expressive anime eyes with two white highlights. The background is one perfectly flat, uniform, solid bright chroma-key green from edge to edge: no gradient, no vignette, no floor, no cast shadow, no particles, no props or scenery behind the figure.
The sheet is a grid of four columns by three rows, twelve cells of the same character in reading order, left to right and top to bottom, separated by generous empty padding of the same flat green, with no frames, no borders, no divider lines, no labels and no text. Every cell shows the same character with the same design, colours and proportions; the cell description sets that cell's expression and pose, and the character description below gives the design.
Void, a hooded shadow figure who fills the frame as fully as the human busts do: the top of the head a small margin below the top edge, the figure spanning most of the frame width, cut by the bottom edge at mid-chest: a deep indigo-violet robe with a large pointed hood, the face inside the hood completely black with no features except two tall white glowing oval eyes, a thick bright orange scarf wrapped around the neck with frayed ends trailing to one side, dark gloved hands. Key colours: indigo violet and orange.
Cell 1 (neutral): a calm neutral look, the two tall white oval eyes at rest. Cell 2 (happy): happy, the white eyes curved into bright upturned crescents. Cell 3 (amused): amused, one white eye narrower than the other, the hood tilted slightly. Cell 4 (thinking): thoughtful, the white eyes looking up and aside, one gloved hand raised to the hood. Cell 5 (concerned): concerned, the white eyes tilted inward and upward, the hood drooping slightly. Cell 6 (annoyed): annoyed, the white eyes flat half-closed slits. Cell 7 (surprised): surprised, the white eyes wide round circles, the hood rising. Cell 8 (determined): determined, the white eyes narrowed and angled inward, the hood set forward. Cell 9 (welcome): arms opened wide in welcome. Cell 10 (document): holding up a sheet of paper, a document. Cell 11 (point): pointing one gloved finger forward. Cell 12 (unimpressed): unimpressed, the eyes flat narrow slits, the head tilted.

Binary file not shown.

After

Width:  |  Height:  |  Size: 191 KiB

View file

@ -0,0 +1,30 @@
# Weksa r1a
## Hypothesis
A sheet keeps the character consistent across twelve cells from the prompt alone: the busts' shared style block adapted for a sheet, the canon character block verbatim, and twelve short cell descriptions.
## Variable changed
Baseline: prompt only, no reference image.
## Render record
- Model: FLUX 3 Image, `POST https://api.bfl.ai/v1/flux-3-image`
- Parameters: aspect_ratio 4:3, resolution 2k, safety_tolerance default, grounding default; no seed field
- Reference: none; rendered from scratch from the prompt alone
- Output: 2368x1776, source format PNG; 2k original kept out of git at F:/Projects/cast-art-originals/poses-r1/weksa/weksa-r1a.png
- Cost: about $0.10 per request (reported by API: {'cost': 10.0, 'input_mp': None, 'output_mp': None})
- Request id: 96f45121-c6c8-4a54-b6c7-15a98978722d
- Date: 2026-10-14
- Cell order: neutral, happy, amused, thinking, concerned, annoyed, surprised, determined, map, fieldwork, argue, interlingua
## Prompt
Character expression sheet for a game cast lineup: a sheet of twelve cells, each cell a bust, head and shoulders cropped at mid-chest by the bottom edge of the cell, the character in three-quarter view turned toward the right side of the cell, the head centred horizontally in the cell with its top a small margin below the top edge of the cell, the same crop and scale in every cell. Super-deformed chibi proportions: the character is two heads tall in total, so the head is very large compared with the small shoulders and narrow torso. Clean 2D anime illustration drawn to be traced into vector art: one bold dark outline of even weight around the whole silhouette, thinner inner lines, flat cel shading with exactly one base tone and one shadow tone per material, light from the upper left. No gradients, no texture, no painterly blending, no glow halos, no pixel art, no 3D rendering. A limited palette of five or six flat colours taken from the character's key colours. Large expressive anime eyes with two white highlights. The background is one perfectly flat, uniform, solid bright chroma-key green from edge to edge: no gradient, no vignette, no floor, no cast shadow, no particles, no props or scenery behind the figure.
The sheet is a grid of four columns by three rows, twelve cells of the same character in reading order, left to right and top to bottom, separated by generous empty padding of the same flat green, with no frames, no borders, no divider lines, no labels and no text. Every cell shows the same character with the same design, colours and proportions; the cell description sets that cell's expression and pose, and the character description below gives the design.
Weksa, a tomboyish young woman, an adventurous field archaeologist in the Indiana Jones mould: warm brown skin, a confident lopsided grin, a smudge of dust on one cheek, messy dark brown shoulder-length hair tied partly up in a topknot with turquoise and amber beads and small feathers, large round gold-rimmed glasses, warm amber-brown eyes, dangling turquoise earrings. She wears a cream linen robe with teal embroidered trim, its sleeves rolled up to the elbows, over a weathered brown leather vest, with beaded necklaces and wooden bead bracelets and a leather strap across her chest; a battered brown leather backpack stuffed with rolled scrolls and a small carved idol shows behind one shoulder. She holds up a small paper card with a hand-drawn glyph between two fingers. No hat. Key colours: teal and amber on earthy browns.
Cell 1 (neutral): a calm neutral expression, mouth closed, looking ahead. Cell 2 (happy): a broad happy smile with bright eyes. Cell 3 (amused): an amused smirk with one eyebrow raised, a stifled laugh. Cell 4 (thinking): a thoughtful expression, eyes looking up and aside, one hand raised to the chin. Cell 5 (concerned): a concerned expression, brows drawn together and tilted up, a small worried frown. Cell 6 (annoyed): an annoyed expression, flat half-lidded eyes, a pursed frown. Cell 7 (surprised): a surprised expression, wide eyes, mouth open in an O. Cell 8 (determined): a determined expression, narrowed eyes, a firm set mouth, a small nod. Cell 9 (map): unrolling a map scroll and studying it. Cell 10 (fieldwork): brushing dust off a small relic with a soft brush. Cell 11 (argue): arguing, one finger jabbed forward, mouth open mid-sentence. Cell 12 (interlingua): holding two glyph cards side by side, comparing their meanings.

Binary file not shown.

After

Width:  |  Height:  |  Size: 335 KiB