TypeScript Survival Guide

Blog

Hair Texture in SDXL: How We Drew 58 Scouts

Hair texture in SDXL: how we drew 58 scouts

Every scout in this course is AI-drawn, and the hardest part was never faces. It was hair. A type-4 coily afro, a sleek single braid, beaded box braids, a windswept ponytail — each needs different prompt machinery, and getting it wrong breaks recognition faster than any face swap. This post documents exactly what worked for us, with the settings, tokens, and gate thresholds, so you can reproduce it.

Aaliyah: type-4 coily afro rendered as halftone-dot mass with stippled edges

The frozen core

All 58 portraits share one frozen render core. Nothing below varies per scout except the seed and the identity paragraph:

  • checkpoint sd_xl_base_1.0.safetensors, no refiner
  • 25 steps, CFG 7.0, euler sampler, normal scheduler, denoise 1.0
  • headshots 1024x1024, sheets 768x1344

Freezing the core is the whole trick. When settings never move, every visible difference traces to the prompt or the seed, and the seed is logged. Each render writes a prompt sidecar recording scout, kind, seed, seed offset, blessed seed, settings, identity paragraph, palette, ComfyUI prompt id, and output filename. Losers are kept as .prevN files with their own sidecars instead of being deleted.

What actually renders hair texture

SDXL’s dual text encoders carry fine texture tokens well at 1024px. Three techniques did the real work:

1. Name the texture system, not just the style. “Afro” gives you a round cloud. “Voluminous high-puff type-4 coily afro” gives you Aaliyah above: dense halftone-dot coil mass with a stippled, broken edge instead of a smooth outline. Hair-type vocabulary (type-4 coily, type-2B loose wave, silky-straight) steers the diffusion into distinct texture regimes. Use the real cosmetology terms; the model knows them.

2. Never-negatives. Every paragraph carries ban phrases: “never straightened never loose curls never flat” for the afro, “never bob never ponytail never loose hair” for the braid. SDXL drifts toward generic pretty hair without them. The negatives cost nothing and prevent the most common failure (everything becomes loose wavy locks).

3. Motion and part tokens for constructed styles. Braids need “individual strands” and fastening detail (“peach cord tie”, “all of her hair braided into that one braid”) or the plait melts into a rope. Windswept styles need motion words or they render as still.

Evidence, shot 1: Maya’s rope twists

Maya headshot

First Bedrock-finale shot, graded technique by technique. Twist vocabulary plus center part plus countable falls held: two falls, parted center, cream shirt, khaki vest, plum neckerchief, every never-ban, comic-ink style transferred to a new venue. Three misses, documented because limits are the next section: the falls read three-strand rather than rope-twist, so vocabulary picks the regime and eyes verify the subtype. The background went plum wash with border edges — the neckerchief’s color migrated, which makes color containment open work. And the knife never appears — held-low plus headshot crop means out of frame, which is why props are sheet business.

Why we built the GPU worker

The Bedrock endpoint takes prompt, negative, aspect, seed. No steps, no CFG, no sampler — the entire frozen core above is inexpressible there, and the style lock did not survive the trip. Sade at seed 5030 rendered photoreal: no ink outlines, no halftone, a long brown ponytail against a never-long-hair ban, complexion far lighter than her verified #6B4226. Aaliyah at seed 5001 also rendered photoreal, with large hoop earrings against an explicit ban and a knotted headband against the bow ban. Both verdicts are FAIL in bedrock-runs.json, kept as baselines. Two dialed-in prompts failing on style plus bans is not a prompt problem. It is a venue problem.

So the pipeline moved to a venue that expresses the whole recipe: one ephemeral g5.xlarge spot in us-west-2, ComfyUI pinned by commit hash, SDXL base plus canny controlnet plus ip-adapter baked into an AMI, jobs as immutable envelopes in an S3 queue (pending/running/done/failed), a queue agent that POSTs each graph to local ComfyUI and uploads png plus thumb plus sidecar per job. Same frozen core (25 steps, CFG 7.0, euler, normal), same spec-verbatim strings, plus the one thing Bedrock cannot run: her facamesh control PNG through canny at her mesh strength. Sade goes first at her same seed 5030 — same numbers in, venue is the only variable.

The honest limits

Our gate checks hair as palette color within tolerance (hair hex vs sampled pixels, dE cap 20), plus identity-paragraph lineage. That catches wrong-color hair every time. It does not catch wrong-style hair in the right color: one passing render followed “single long braid over one shoulder” with loose flowing hair, green across the board.

Aarna: flowing dark hair with strand linework, passed the gate on color

The fix is human review of winners, not a stricter number. Stricter thresholds just convert style misses into seed-lottery loops: we burned five offsets on accent dE 29.5-vs-28 misses that no human could see. Measure color with numbers, judge style with eyes.

The versioning loop anyone can copy

  1. One blessed seed per scout per kind (sheet block 1000s/6000s, headshot block 5000s/7000s — distinct blocks per troop so identities never collide).
  2. Render at offset 0. Gate it: lineage (paragraph verbatim in sidecar), hair/accent dE caps, edge-density band, background floor, dHash dedup against sisters.
  3. On fail, re-roll offsets 1–4 (never more than five attempts per kind). Back up any passing file before overwriting; keep the best regardless of verdict.
  4. Log every round in a provenance ledger: seed, offset, settings, palette, identity hash, gate fails. Regenerate, don’t hand-edit.

Run renders through ComfyUI’s API (POST /prompt, poll /history), one GPU, one server, personas sharded across background workers with the queue as the serializer. Tests live next to the scripts; throwaway probes stay in /tmp.

Reproduce it

Install ComfyUI with the SDXL base checkpoint, freeze the settings above, write one identity paragraph per character with texture terms plus never-negatives, and run the seed-offset loop with a color gate and human style review. Our scripts (scouts_render.py, scouts-fidelity-check.py, scouts-ledger.py) follow exactly this shape. Start with three hairstyles as different as ours — coily afro, sleek braid, constructed updo — and you will find your own never-negatives within five offsets.

Missteps log (Aaliyah, 2026-09-27)

What broke, in the order we broke it — kept so the next track doesn’t pay twice:

  1. Face lock at 0.18 instead of 0.65. Four EC2 graphs (v36-v39) ran canny ControlNet at 0.18 against a mesh file that specifies 0.65. Identity drifted and EC2 looked environmentally broken; it was one number in our own graphs. Env parity (checkpoint, sampler, weights) verified identical — always check your own graph first.
  2. Invented texture tokens. micro-spring coils with zigzag coil structure was never ablated; the ablated string is type-4 coily plus finger coils plus the triple ban. The inventions even leaked into specs/aaliyah.md and had to be corrected back.
  3. The euphemism that renders straight hair. 4C and kinky-coily trip the Bedrock filter, but type-4 coily passes it (ledgered, seed 5112). Deleting type-4 for micro-coil texture collapsed every Bedrock render to loose/wavy hair — and when volume words went with it, the whole template Europeanized. Never drop a proven token for a synonym the model hasn’t earned.
  4. Filled mass is invisible to structure control. A filled white crown ellipse over the facemesh changed nothing (short wavy bob, same seed/prompt A/B). The model reads edges, not fills.
  5. Blind five-seed ladders. Five systematic misses cost 5x one miss. New rule: two-rung regime check — identical misses twice kills the variable, and unspent seeds are never rendered.
  6. Ephemeral workers die quietly. The spot worker self-terminated on idle; two jobs sat pending for hours while the lane looked “stuck”. Spot had no g5.xlarge capacity region-wide; on-demand (~$1/hr) relaunched the lane. Check the queue state, not the queue length.

ultra vs core for aaliyah (2026-09-27)

same 58-word bound prompt, two engines. core seed 7002 holds a single coil mass with a thin band (3.5/5, hoops persist). ultra seed 8002 splits the hair into double side-puffs, crops the silhouette at the canvas edges, renders the band thick and wrap-like, and loses the uniform. ultra weights multi-volume photoreal shapes over the flat comic-ink single-puff the prompt asks for, so the ultra lane is dropped and core stays the venue. ledger: bedrock-runs.json run ultra-8002.

Aaliyah on ultra: double-puff split, cropped silhouette, wrap-like band

EC2 worker recovery protocol (2026-09-27)

The relaunched worker failed three independent gates, each found by evidence instead of reassurance. The standing procedure is now scouts-pipeline/cloud-worker/HEALTHGATE.md plus scripts/worker_healthgate.py (ten gates, exit 0 only on OPEN):

  1. AMI without the agent. The baked image never shipped agent.py, so the queue agent died on boot with INVALIDARGUMENT. Fix: stage the repo’s cloud-worker/agent.py through the S3 bootstrap prefix and pull it on-host. AMIs are guilty until proven innocent — verify the entrypoint exists.
  2. Python 3.11.0rc1 venv. Current torch cannot import without sys.get_int_max_str_digits, which jammy’s 3.11.0rc1 lacks — the exact failure bake.sh warns about. Fix: rebuild the venv on deadsnakes 3.12 in place and reinstall torch (cu126) plus both requirements files. The gate enforces the sys attribute check.
  3. IPAdapter node-not-found. IPAdapterApply missing at prompt time means the custom node failed import, not a schema mismatch — read the ComfyUI log for the import traceback before touching the graph. Schema-shape debugging on a node that never loaded is wasted work.
  4. Crash-loop signature. A service stuck in activating with a climbing restart counter is crash-looping, not warming up. Read journalctl -u, never uptime.
  5. Queue evidence over vibes. Pending jobs plus a stale heartbeat means the loop is dead; running jobs plus fresh heartbeat plus results/ output means OPEN. Report the gate number, never a mood.

What Bedrock’s filter actually blocks (learned 2026-09-27, runs 8013-8030)

The Stable Image Core venue on Bedrock (stability.stable-image-core-v1:1, us-west-2 via bedrock-runtime invoke-model, inference profile us.stability.stable-image-core-v1:1 for core, us.stability.stable-image-inpaint-v1:0 for inpaint) has its own classifier in front of the model. Two findings matter for every prompt you write:

1. Proximity, not vocabulary, triggers the age guard. 6 prompts that placed ear-state words (bare ears, unpierced earlobes, even unadorned ears) within ~4 tokens of mid-teens all blocked with Filter reason: prompt (br-exp-8014 through 8017 plus probes 8019, 8020 — every wording, including the synonym swap). The same ear words ~20 tokens away passed every time (br-charter-8013, br-bis-8018, and the 8021-8028 ladders, 2/2 + 5/5 + 3/3). Zero-ear-mention prompts also passed (8003-8005). Rule we now ship: keep 15-20+ tokens between the age anchor and any ear/skin-state descriptor, or drop ear terms entirely. The palabra bare is not guilty by itself — 18 landed runs carry it far from the anchor — it is the pairing that fires the classifier.

2. Color words are safe in negatives. gold hoops in the negative was suspected but cleared when br-bis-8018 landed carrying it. metal/metal loops likewise passed 3/3 on the primitive ladder (br-prim-8026-8028). Put gold, metal, silver in your negative block if you need to — the filter does not care. What the filter does not block, the model still may ignore.

Ledger and run log: scouts-pipeline/input_assets/bedrock-runs.json (235 runs, last br-prim-8028), scouts-pipeline/docs/aaliyah-track-procedure.md §6, hypotheses live in scouts-pipeline/docs/aaliyah-hoop-study.md.

What negatives can’t fix on the 8013 string (and why inpaint didn’t yet)

The hoop earring is not a ban problem on this string. It is a demographic/texture attractor: mid-teens Black girl + centered single type-4 coily afro mass co-occur with circular gold hoops in training, and the model renders them as part of the aesthetic cluster, not as a detachable accessory.

Evidence on the locked 8013 positive (29 words, comic-ink at token 0, style at front, wardrobe in the middle, ears trailing ~20 tokens out — the only filter-safe layout we have):

  • Shape-negative ladder 8021-8025: hoop earrings, circular earrings, ring earrings, dangling hoops, loop jewelry plus photorealism bans, same string, seeds 8021-8025. 0/5 clean; every frame grew hoops, 8024 grew two rings per ear. (Review cards aaliyah-shape-8021 through 8025, 2.5-3.0/5.)
  • Primitive-negative ladder 8026-8028: circular rings, metal loops, circular jewelry on the same string, seeds 8026-8028. 0/3 clean, all three grew large gold hoops (wide bow, giant bow, gathered band). This was the last prompt-only theory on this string; both families are now falsified. (Cards aaliyah-prim-8026 through 8028, 2.5/5; sidecars aaliyah-prim-*.request.json.)
  • Seed alone doesn’t save it: 0/5 + 0/3 clean on one locked string, with stylelock-8003 as the lone counterexample on a different string (zero ear mention, clean ears). On the 8013 string, seed variance moves the band/kerchief/necklace but not the hoops.

Bedrock inpaint, same base, versioned masks: We tried stability.stable-image-inpaint-v1:0 (via us.stability.stable-image-inpaint-v1:0, fields image, mask, prompt, negative_prompt, grow_mask, seed, output_format, white = inpaint) to erase hoops off the best prim base (aaliyah-prim-8028.png):

  • Masks are versioned in scouts-pipeline/input_assets/masks/ (1536x1536 L, not /tmp), with debug overlays. First mask (aaliyah-ear-mask-8029-initial.png, ellipses at 460,980 & 1070,980 r90) hit the collar — invalid, hoops untouched by construction.
  • Corrected mask (aaliyah-ear-mask-8030-correct.png, ellipses r130x160 at 470,1005 & 1128,990, bbox x340-1258 y830-1165, plus HSV auto trace aaliyah-ear-mask-8030-auto.png for reference) with smooth clean skin, unpierced earlobe, natural ear skin / hoop earrings, circular jewelry, metal rings, gold, grow_mask 8, seed 8030. Result aaliyah-inpaint-8030.png is pixel-identical to aaliyah-prim-8028.png at the ears — hoops persisted identically. No diff between prim and inpaint is the honest result (see review page top two cards). Polarity, tighter hoop-traced masks, and prompt weight remain open; the isolated ear-mask path is not proven on this base.

Hypotheses H1 (attractor SUPPORTED), H4 (gold filter FALSIFIED), H5 (separator SUPPORTED 8/8), H7/H9 (shape/primitive negatives FALSIFIED), H10 (inpaint 0/1 valid) live in aaliyah-hoop-study.md and update only on run evidence.

EC2 control lane reset (v-b-28 onward, 2026-09-28)

After the v-b-21 through v-b-27 control experiments, the EC2 lane reset to a lean control baseline: Canny nodes removed, one torso-masked IPAdapter (aaliyah-outfit-torso-crop-v3.png) at 0.55 with early-only scheduling, and all emphasis returned to plain prompt text. Five rules fell out, each with a run behind it:

1. Token-weight cap 1.05-1.15. v-b-21 carried (type-4c coily afro texture:1.35) with negatives at 1.4/1.2 and grew a halo artifact; v-b-24 carried positives at 1.35/1.3 plus (plain warm-white background:1.4) and blew the hair out white. Anything above ~1.15 on this lane stops steering and starts dominating. v-b-28 onward runs zero parenthesized weights.

2. Afro-noun purge. v-b-21 through v-b-24 all carried the noun afro (type-4c coily afro texture, smooth afro in the negative) and split, haloed, or bleached. v-b-28 drops the noun entirely — springy micro-coiled hair mass forming a single high-puff — and recovers a single mass. The coil adjectives stay; the noun goes.

3. Lean negatives under ~30 words. The v-b-28 negative is 27 words of comma keywords, no sentences, no weight syntax. v-b-29 adds yellow background, glasses, eyewear (see rule 4 for why that backfired); v-b-31 swaps the background ban for solid background, monochrome background instead of growing the list further.

4. The yellow-background negative coupling (v-b-29). Adding yellow background to the negative scrubbed the yellow headband, kerchief color, and wardrobe color with it — color bans couple to same-hue positives. Fix in v-b-31: ban solid background, monochrome background (composition, not color) and let the warm-white positive carry the backdrop.

5. Wardrobe words must live in text. Early-only IPAdapter (0.0-0.35/0.40) leaves steps 11-25 unconditioned, so the torso reference steers silhouette early and text must hold garments late. v-b-28 through v-b-31 carry no wardrobe nouns in the positive and render no vest or kerchief. v-b-32 puts khaki scout vest over white collared shirt, goldenrod yellow neckerchief tied with a slide at collar back in text at IPAdapter 0.0-0.40 to test exactly this.

Lane settings for the reset: IPAdapter 0.55 torso-masked (attn_mask [24,1]) early-only 0.0-0.35 (v-b-28/29), 0.0-0.45 (v-b-30/31), 0.0-0.40 (v-b-32); 25 steps, CFG 7.0, euler, normal; seeds 2128-2132. The v3 plate is verified present on the runner via SSM (26K), so file-no-file cards mean output-missing, not input-missing.

Grades: v-b-28 2.5/5, v-b-29 2.0/5, v-b-30 2.5/5. Sidecars scouts-pipeline/input_assets/scouts-renders/aaliyah-ec2-v-b-*.request.json, graphs scouts-pipeline/comfyui-workflows/aaliyah-proof-headshot-v-b-*.json.

EC2 ears: why the hoops mostly stay off (2026-09-28, v-b-1 through v-b-34)

The Bedrock lane never beat the hoop prior: 0/5 on the shape ladder, 0/3 on primitives, inpaint pixel-identical. The EC2 lane, same character, is mostly clean. Audit of every EC2 request sidecar (aaliyah-ec2-v-b-*.request.json) shows two constants behind that:

1. Explicit jewelry bans in every negative, since v-b-1. earrings, hoop earrings, jewelry, necklace (plus studs from v-b-5 on) ride every EC2 negative through v-b-33. The lean v-b-28 reset trimmed that to bare earrings — and the only hoop regressions of the reset era sit exactly there: studs in v-b-28/v-b-30, full dangles in v-b-29. Bare earrings suppresses; the full four-token block suppresses harder. v-b-6 (full block, no hoops) vs v-b-5 (full block, large hoops) says seed still votes, but the bans move the odds on EC2 in a way they never did on Bedrock core.

2. Clean reference geometry in early IP steps. The torso plate (aaliyah-outfit-torso-crop-v3.png) and face masks carry bare-ear contours, and the adapter runs torso-masked at 0.55 early-only (0.0-0.35/0.40/0.45), so ear pixels get skin vectors before text takes over for steps 11-25.

Honest exceptions: v-b-5 grew large hoops under the full block and v-b-29 grew dangles under bare earrings, so this is odds-shifting, not a lock. But against Bedrock’s 0/8 on the locked string, EC2’s ear record is the lane’s clearest structural win — worth keeping the full jewelry block in every negative even when trimming elsewhere.

EC2 hair, frame by frame: v-b-1, v-b-3, v-b-4, v-b-17 (2026-09-28)

Three early control frames plus the standout, left to right. Same character, same 25-step / CFG 7.0 / euler core throughout — only prompt, canny strength, and adapter change.

EC2 hair strip: v-b-1 ring artifact, v-b-3 flat crop, v-b-4 recovered puff

  • v-b-1, seed 2101, canny 0.65: 1/5, fail. Concentric yellow-black rings orbit the face like a target diagram; the facemesh reads as content instead of structure at full strength. Hair is an unreadable dark mass behind the artifact. The lesson is the one from the missteps log: check your own graph first — the venue was fine, the strength number was not.
  • v-b-3, seed 2103, canny 0.25, same prompt: 1.5/5, fail. The rings are gone and the style lock returns, but the hair collapses to a flat short crop under a wrap-wide yellow band, eyes render amber-yellow against the ban list, and neither vest nor kerchief appears. Lowering control fixed the artifact and exposed how little hair the bare prompt holds without coil adjectives.
  • v-b-4, seed 2104, canny 0.25, coil adjectives restored: 3/5, hair win with accessory fails. voluminous high-puff centered single type-4 coily afro mass with tight springy coils brings back one centered mass with visible twist-out texture and a stippled hairline. The band is still thick and wrap-like rather than thin-flat, thin hoop earrings sit in both ears against the full jewelry ban, and the background is blueprint linework. Hair: keep the adjectives. Ears: seed still votes.
  • v-b-17, seed 2117, controlnet killed @0.05, torso-masked IPAdapter @0.65: 4/5, best EC2 hair to date. A full type-4 coil mass with a broken, stippled perimeter — no rings, no bands-as-warps, no jewelry, no background crowd. The tradeoff is wardrobe: with control killed and only the torso plate steering early steps, vest and kerchief never render (plain tee). On this lane that is the honest trade — text alone must carry garments late, and this prompt does not.

Aaliyah EC2 v-b-17: full type-4 coil mass, stippled perimeter, clean ears

Sidecars: scouts-pipeline/input_assets/scouts-renders/aaliyah-ec2-v-b-{1,3,4,17}.request.json, graphs scouts-pipeline/comfyui-workflows/aaliyah-proof-headshot-v-b-*.json.

Bedrock 8000s ladder: what each rung proved about hair (2026-09-28)

The 8000s ran on Stable Image Core (stability.stable-image-core-v1:1, us-west-2) as a controlled prompt ladder: same 58-word bound string family, one variable per rung, seeds 8002-8009. Hair first, ears second — every frame below is graded on hair with the hoop record noted, because on this venue the hoops never left.

  • 8004 reorder: 2/5. Moving wardrobe before style moves everything: coils return but as twin side masses instead of one centered mass, the band ties a bow-knotted knot against the bow ban, gold hoops return, and the uniform degrades to tee plus backpack plus necklace. Token order steers composition, not just emphasis — nothing here is position-independent.
  • 8007 shorten: 2/5, the hair-fail example. Cutting the coil adjectives to shorten the string collapses the hair to a straight loose wavy bob — the coil words were load-bearing, and this frame is the proof. Kerchief knot, collar, white background, and ink style all hold, which makes the failure precise: everything survived except the one thing cut. Also honest: gold hoops against a jewelry ban, and model-rendered gibberish text on the chest patch (a second, independent fail).
  • 8008 typelock: 3/5, coils back. Locking type-4 plus tightly coiled afro hair plus stippled afro perimeter restores a single centered coil mass with visible curl clumps — the turnaround against 8007 on nearly the same string. The band renders wide and knotted rather than thin-flat, the kerchief goes dark, and hoops plus backpack straps persist. Hair win, accessory fail.

8007: shortened prompt, coil words cut, hair falls straight (hair fail)

8008: type-4 locked back in, single centered coil mass returns

  • 8009 bare-ear: 1.5/5. The zero-jewelry-token probe — no earring, hoop, jewelry, or metal word anywhere in the prompt — and the frame still grows large gold hoops. Leakage from the prompt is falsified; hoops are default ear rendering on this venue. Hair splits into twin puffs under a bow-knotted band, so this rung fails on hair shape too.

8004: reordered prompt, twin side masses and bow-knotted band

8009: zero jewelry tokens in the prompt, large gold hoops anyway — twin-puff split

  • 8018 goldneg: 2/5. Carrying gold hoops in the negative clears the filter (color words are safe in negatives) but not the ears: gold hoops render anyway. The venue also breaks to photoreal here rather than comic-ink, the hair splits into twin twist-topped puffs under a bow-knotted band, and the uniform becomes a denim vest with a scarf. One rung, three independent fails — venue, hair shape, ears.
  • 8021 shape-negatives: 2.5/5, best Bedrock hair shape. First rung of the shape ladder (hoop/circular/ring/dangling/loop bans on the locked 8013 string): a single centered coily mass with a thin flat band — the hair the string always wanted. Earrings are large gold hoops regardless, with a necklace and backpack added. 0/5 clean across 8021-8025 says shape negatives are falsified as an ear fix; this frame survives as the hair reference, not the ear solution.
  • 8026 primitive-negatives: 2.5/5. The primitive ladder (circular rings, metal loops, circular jewelry) on the same locked string: single mass holds, band ties a side bow, background goes sage, straps go green, necklace appears, gold hoops persist. 0/3 clean closes the last prompt-only theory on this string.

8018: gold in the negative passes the filter but not the ears — photoreal break, twin puffs

8026: primitive negatives, single mass with side bow — hoops persist

  • 8030 inpaint: 0/1 valid, honest fail. The corrected ear mask (ellipses r130x160 at 470,1005 and 1128,990, grow_mask 8, erase prompt smooth clean skin, unpierced earlobe) returned a frame pixel-identical to the aaliyah-prim-8028 base at the ears — hoops untouched. The mask path is not proven on this base; polarity, tighter hoop-traced masks, and prompt weight remain open.

8021: shape negatives fail on ears, but the single centered coil mass is the Bedrock hair reference

8030: inpaint off the 8028 base, hoops pixel-identical — the mask path is unproven

Ledger: scouts-pipeline/input_assets/bedrock-runs.json (runs 8002-8030), hypotheses H1/H4/H5/H7/H9/H10 in scouts-pipeline/docs/aaliyah-hoop-study.md.

Bound prompt vs ultra engine: 7002 against 8002 (2026-09-27)

Same 58-word bound prompt, two engines — the only head-to-head where the prompt is truly frozen.

  • 7002 core: 3.5/5, best Bedrock hair. Twist-coil clumps with visible finger-coil structure under a thin flat yellow band, single centered mass, khaki vest and white collar present. The fail is ears-only: silver hoops against the ban, and per the ledger, text cannot fix ears on this venue — all prompt approaches exhausted.
  • 8002 ultra: fail, lane dropped. Double side-puff split, silhouette cropped at the canvas edges, thick wrap-like band, uniform lost to backpack straps. Ultra weights multi-volume photoreal shapes over the flat comic-ink single puff the prompt asks for. The ultra lane is dropped and core stays the venue (owner verdict 2026-09-27, ledger run ultra-8002).

7002 on core: twist-coil clumps, thin flat band — best Bedrock hair, hoops the only fail

Zero-negative pair: 6010 win, 6005 weirdness (2026-09-28)

No negative prompt at all — the positive must carry everything. Both frames land the tightest coil texture of the Bedrock set (tight finger coils, tightly packed micro-spring coils), and both grow the jewelry the missing negative would have banned. That is the finding: zero-negative is a hair win and an ear loss on the same frame.

  • 6010: 3/5, the zero-negative win. Dense packed coils, thin flat band, single mass. Silver hoops, a choker-style necklace, and a teal vest all render unopposed — with no negative, defaults rule accessories. Carries the coil texture to copy into strings that can afford a negative block.
  • 6005: 3/5 keep-best, the hair weirdness. Same coil texture, but the mass escapes into two low falls behind the shoulders tied with gold bands, and the neckline drops to a choker-collar. Coils correct, silhouette wrong — the failure mode to watch when stacking coil-density adjectives without a silhouette anchor like single centered mass.

6010: zero negative, tightest coils and thin band — with unopposed silver hoops and choker

6005: same coils, but the mass escapes into tied low falls — density without a silhouette anchor