decisions/ART_CONSISTENCY_MECHANISM_RULING_2026-08-04.md
Seat: B1, the ruling seat PIPE_ART §6 Q4 reserved. Indexed in DOC_MAP; the payload contract it makes load-bearing is docs/generation_lifecycle.json via harness/generation_prompt_hash.py. Date: 2026-08-04. Lane: ART (Lane G).
Instance: the ART ComfyUI at 127.0.0.1:8189, Z-Image-Turbo bf16, Apache-2.0.
PIPE_ART §6 Q4, verbatim:
Per-realm style LoRA vs multi-reference personalization — which actually holds a nine-plate
board series together? Cheaper answer wins; the loser is dropped, not kept "just in case."
And PIPE_ART §1's EXCLUDED tier had already fixed the shape of the answer by killing the 2024 tool:
The brief's "IP-Adapter consistency tooling" is a 2024 answer. The 2026 mechanism is native:
HiDream-O1 multi-reference personalization, Qwen-Edit-2511 multi-image identity, and a
per-realm style LoRA.
The question came due because the REGEN BELT ran out of prompt. Four rungs of prompt-only
regeneration have now been read plate by plate:
39 of 40 reproduced the same defect the rung-1 LOOK had already named. A seed cannot correct
a prompt that never states the fix.
5 landed, 47 still fail — and they fail with clustered, reproducible defects, not noise.
Four rungs, 268 plates generated and looked at, and 47 rows are immovable by words. That is the
evidence that earns a mechanism change, and it is why Q4 could not stay a benchmark-day question.
Q4's either/or is REJECTED as a false fork, and the reason is measurable in the 47 survivors.
The two mechanisms do not compete on one axis; they answer two different failure modes, and the
belt's own defect classes prove it. harness/../scratchpad/rung4_classify.py computes the class
from each row's LOOK note — specifically from the clause AFTER the note's "…are gone, BUT…"
pivot, since only that clause names a defect that is still alive:
| defect class | rows | what is wrong | mechanism ruled |
|---|---|---|---|
manufactured_intrusion | 30 | a rivet, a screw, a graded road, a concrete kerb, corrugated roofing, a machine-printed sarong — manufactured material where the region owes wild or handmade | style LoRA + clustered affirmative fix |
identity_species | 9 | the animal is the wrong animal: a hard-scuted turtle where the species is a leathery softshell, a Komodo rearing bipedally, a boot-sole tread where a deer owes two kidney cleats | reference conditioning |
garment_dress | 4 | a bare chest, a modern knit, a machine-printed cloth against a stated garment law | style LoRA + clustered affirmative fix |
plate_register | 2 | an elevation where the row owes a section; four basins where the caldera owes three | style LoRA + clustered affirmative fix |
material_render | 2 | sulfur as plastic tubes; a figured motif on cloth ruled plain | style LoRA + clustered affirmative fix |
38 rows are LOOK failures. The accepted corpus already carries the right answer for every one
of them — 320 landed plates that know what wild unworked basalt looks like in this region, what
plain undyed handspun reads like, what the region's light does. A style LoRA is exactly the
machine for transferring "what the accepted plates look like" onto a new prompt, and it is the
cheaper mechanism by a wide margin: **one training run amortized across every future plate in the
region, versus a reference image selected, verified and carried per row, forever.**
9 rows are IDENTITY failures, and no style transfer can touch them. A LoRA trained on OUR
plates cannot install a morphology none of our plates carry. Words have failed at this four times
in a row. These rows need a picture of the right animal in the sampler, which is reference
conditioning.
So the loser is not dropped — the SCOPE is. Per-realm style LoRA is the DEFAULT mechanism and
the one that scales; reference conditioning is retained, but demoted from "the consistency
mechanism" to a per-row remedy for identity/morphology rows only, which is where it earns its
per-row cost. That is the honest form of "cheaper answer wins": it wins the general case, and the
exception is named and bounded rather than kept "just in case."
The task's preferred reference is a LANDED plate of the same subject class. Every one of the 9
identity rows has landed same-class plates. **They were opened and read, and only some of them
carry the right animal:**
PLT_A0056_1 is correct: quadrupedal, belly low, heavy trunkhorizontal, forked yellow tongue. USABLE.
PLT_A0201_1 is correct: slender, long tapering head, whip-thinbanded tail. USABLE.
PLT_E079_1, the rung-3 plate that PASSED its LOOK, is correct:living whole stag, three-tine lyre on round beams, plain coarse grey-brown coat. USABLE.
The four snout studies render a long scaly gharial-like neck rising from water; the four carapace
details render polygonal keratin panel seams across the disc, which is the exact defect the REC
line names. A landed reference here would PROPAGATE the defect.
face mask the REC line calls out. Same problem: the corpus is wrong in the same direction.
So for 5 of the 9 identity rows the reference is a synthesized morphology staging, generated
from the creature registry's own species name (CR_0153 = *Chitra chitra javanensis*, the Flores
giant softshell turtle, the FAM_01 familiar "Shell"), read and accepted before it is used as a
reference. Never an un-licenced photo, and never a landed plate that a LOOK has just convicted.
This is a finding the pipeline needs beyond this rung: **"condition on a landed plate of the same
subject class" is unsafe as a blanket rule.** A landed plate is a plate that passed a LOOK for its
OWN row's defect line — that is not the same as being right about a species. The rule has to be
*condition on a plate whose morphology has been read for THIS purpose*, and where none exists, stage
one.
Training stack — chosen because it runs on this box today, not because it is fashionable.
| piece | pick | licence | evidence |
|---|---|---|---|
| trainer | examples/dreambooth/train_dreambooth_lora_z_image.py from diffusers @ tag v0.39.0 | Apache-2.0 | GitHub API license.spdx_id, re-fetched 2026-08-04 |
| base weights | Tongyi-MAI/Z-Image-Turbo @ f332072aa78be7aecdf3ee76d5c247082da564a6 | Apache-2.0 | HF API cardData.license, re-fetched 2026-08-04 |
| runtime | the EXISTING D:/assetgen/venv — diffusers 0.39.0, peft 0.20.0, accelerate 1.14.0, transformers 5.14.1, torch 2.9.0+cu128 | — | — |
| added | datasets 5.0.1 | Apache-2.0 | PyPI JSON, re-fetched |
Full rows, including the one package that was installed and then removed, are in
docs/tooling_download_manifest.json.
Z-Image LoRA training is officially supported upstream — the "if it is genuinely unsupported,
say so and fall back" branch does not fire, and the evidence is the file existing at the tag.
Three engineering facts worth carrying forward:
1. Version-match the trainer to the installed library, do not upgrade the library. The
main-branch copy of the same script pins check_min_version("0.40.0.dev0") and imports
generate_aspect_ratio_buckets, which 0.39.0 does not export. The v0.39.0 tag carries the
script; v0.39.1 does not. Fetching the tag left the SHARED venv untouched while other lanes
were live on this box.
2. The ComfyUI load path was verified in source before a single GPU hour was spent.
comfy/lora.py:341 runs comfy.utils.z_image_to_diffusers(...) inside the Lumina2 branch
that Z-Image inherits, and registers transformer.<key> aliases — so a diffusers/peft LoRA
loads with no key surgery. Verifying the consumer before building the artifact is the cheap
half of this whole job.
3. torch.cuda.mem_get_info and nvidia-smi disagree on this Windows box — smi reported
20.5 GB used by co-resident UE and Gaea lanes while CUDA reported 30.3 GB free. The CUDA
number is the one that decides whether training fits. Trusting smi would have pushed the run
onto an FP8 path it did not need (and the torchao install that FP8 needed broke the
transformers import chain outright — see DL_0004).
The corpus — 320 plates, and every one of them ours.
generation_status == 'complete' in PLATES.csv with the file present on E: gives 325 landed
plates, all rights_value = generated_local, all Tongyi-MAI/Z-Image-Turbo, all Apache-2.0
inherited. Five are held out for validation; 320 train.
The captioner is deterministic and it is not a describer. lora_caption.py recovers the EXACT
prompt that produced each plate by looking its generation_prompt_hash up in the stored
generation plans — 301 of 325 resolve that way; the remaining 24 fall back to a caption assembled
from the row's own PLATES.csv fields plus its board's authored title. That choice is the whole
design: a style LoRA learns the RESIDUAL between what the caption says and what the image shows,
so captioning with the generating prompt makes the residual **the accepted look and nothing
else**. Captions are affirmative-only on the same law as the belt's prompts, and the script
asserts zero negation clauses across all 325.
style_lora_hash has been one of the eleven CLOSED payload keys since contract v1.1.0, carrying
the empty string on every live row and waiting for exactly this. It is now load-bearing: the LoRA
file's hash lands on that axis, inside generation_prompt_hash, so **retraining or swapping the
LoRA fires regeneration_required on every dependent row without anyone remembering to check** —
the same self-enforcement C-12(3) built for licence demotion.
Reference conditioning had a harder problem: the key set is CLOSED at eleven and there is no
reference_image key. It rides inside sampler_config, which IS one of the eleven and IS
hashed, as denoise + reference_sha256 + reference_source. So swapping a reference changes
artifact identity exactly as swapping a seed does. Adding a twelfth key would have re-baselined
every stored hash and, because hash[:12] is the filename, physically renamed every plate on
disk — which is precisely the cost the contract's own comments warn about.
The proven rung-1..3 graph, with exactly two additions:
LoraLoaderModelOnly between UNETLoader and ModelSamplingAuraFlow.LoadImage → ImageScale → VAEEncode replacing EmptySD3LatentImage, with KSampler.denoise below 1.0.
Negative conditioning is still zeroed at node 33 and cfg is still 1.0, so **the affirmative-only
law is untouched** — a negation token in a prompt on this graph is still a request for the defect,
and belt_build4.py still asserts zero negation tokens twice on every emitted prompt.
Five landed plates were held OUT of training by a deterministic rule (first plate of each of the
five most-represented boards). Each is regenerated at its OWN original prompt and OWN original
seed across a strength ladder that includes 0.0 — the control, and read side by side against
the accepted plate.
The control is the load-bearing cell. Z-Image-Turbo is a DISTILLED eight-step model; training a
LoRA on distilled weights with the flow-matching objective can degrade the short-step sampling the
distillation bought. Strength 0.0 through the identical graph separates "the LoRA did this" from
"the day did this", and it is the only cell that can catch the failure mode where a style LoRA
technically works and quietly ruins the 8-NFE path the whole throughput budget rests on.
docs/art_boards/morphology_references.json — the staged references, their prompts and shas, their consumers, and the one that could not be made.docs/tooling_download_manifest.json — every download, its pinned revision, its re-fetched licence.scratchpad/lora_caption.py — the deterministic captioner (320 train + 5 holdout).scratchpad/rung4_classify.py — the defect classifier and the routing rule.scratchpad/belt_fixes4.py — 38 authored affirmative fixes, zero negation tokens.scratchpad/belt_build4.py — the rung-4 plan builder; identity rows carry their reference.scratchpad/belt_dispatch4.py — the dispatcher; LoRA + optional img2img, backs off, never kills.scratchpad/lora_validate.py — the holdout side-by-side with the strength-0 control.D:/assetgen/train/zimage/ — trainer, launch script, dataset, run log.The holdout read PASSED. Five landed plates held out of training, regenerated at their own
prompt and own seed at strengths 0.0 / 0.6 / 0.8 / 1.0. The look transfer is unmistakable and
monotonic — the control renders a bright blue sky and saturated green over the Inerie ridge where
the accepted plate is a near-monochrome ash slope, and the ladder walks it back to the accepted
dry-season register step by step; the site-plan row's control renders a flat GIS choropleth with a
rendered legend box and the ladder pulls it into the accepted painted-map palette. **And the
distilled sampling survived**: all five strength-1.0 outputs are clean, coherent, correctly
composed images with fine detail intact, so the failure mode worth fearing — a LoRA that works and
quietly ruins the 8-NFE path the throughput budget rests on — did not occur. Applied at 0.8.
Validation record: scratchpad/lora_val/VERDICT.json + holdout_sidebyside.png.
**The apply: 47 plates dispatched, 47 opened and read against their own surviving-defect line,
22 LANDED.**
| defect class | rows | landed | note |
|---|---|---|---|
manufactured_intrusion | 30 | 17 | the class the mechanism was ruled for, and it moved: riveted plate, concrete kerb, sawn end-cuts, machine-printed sarong, red-roofed buildings, the djembe, the made torch-pole and the community cordage all gone |
garment_dress | 4 | 3 | |
identity_species | 9 | 2 | rows 41 (softshell, on a staged reference) and 77 (cloven hoof, on NO reference) |
material_render | 2 | 0 | |
plate_register | 2 | 0 |
Three findings the numbers carry, and none of them is comfortable:
1. The mechanism works on the class it was ruled for. 17 of 30 manufactured-intrusion rows
landed after four rungs of words could not move them. That is the ruling paying for itself.
2. Reference conditioning fixed the anatomy and the plates failed on something else. Row 32's
Komodo stopped rearing bipedally — and the plate acquired a rendered interface badge and a
scale-bar ruler. Row 82's doubled muzzle resolved — and the child's tunic acquired rendered
lettering. Row 78's monitor came down onto four feet — and the child lost its face to a
mannequin blank. Row 43's softshell is correct — and the child's head is cropped out of frame on
a row whose whole job is scale. **img2img at denoise 0.80-0.85 buys the subject and destabilises
the rest of the composition**, and that is the honest cost of the mechanism, not a fluke.
3. The best identity result used no reference at all. Row 77's cloven-hoof sign was the one
staging that could not be produced — four attempts all returned human footprints, because
"prints in mud" reaches this model's footprint prior before it reaches any animal. It ran on the
LoRA plus an affirmative morphology clause alone, and it PASSED: at 2x each mark resolves as two
teardrop gouges with a mud wall between them. Words the model would not obey on a blank canvas
it obeyed once the LoRA carried the render.
One row shows the LoRA's own limit. Row 38's horse smeared into a soft blurred mass at 0.8
where the previous rung was crisp — the only plate in 47 where the style visibly over-applied. It
is named here rather than averaged away, and it is the argument for a per-row strength rather than
a lane-wide constant.
**25 rows stay regeneration_required, each with its persisting defect named from what was seen
in the image** — three of them naming a REGRESSION rather than a survival (row 42 corrected the
animal and lost the through-water read it had already earned; row 21 corrected the sulfur and lost
the boss the pocket exists to stage; row 15 removed a machine-even glyph and left no mark at all).
Nothing failing was landed and no passing plate was implied.
What rung 5 needs, stated so nobody re-derives it: a lower img2img denoise (0.6-0.7) with the
composition re-stated in the prompt for the identity rows; a per-row LoRA strength; and, for the
sulfur-crust and lodok-geometry classes that four rungs plus the mechanism have all failed, a
Lane-R acquired underlay rather than another generation.
Section 8 closed by writing three prescriptions for rung 5 "stated so nobody re-derives it". Rung 5
executed exactly those and nothing invented beside them. Of the 25 rows section 8 left open, 2 were
ROUTED and 23 were dispatched at one plate each; every plate was OPENED and read against the
rung-4 defect line for its own row, twenty-one deciding cells again at 2-4x crop. **10 landed, 13
stay regeneration_required with the persisting defect named from the image.** The belt's picked
count moves 63 to 73 of 88; open rows 25 to 15.
Prescription 2 is the cleanest result in the belt. Row 38 was the single plate in 47 where the
style visibly over-applied. At a per-row strength of 0.55 the smear is gone and the crisp painted
read is back — individual mane hairs, hard-edged hide folds, sharp hoof — and the count defect went
with it: one red point, seated in the eye, the only red in the frame. A lane-wide constant could
never have produced that, and the row whose failure argued for a per-row strength is the row it
fixed. The strength moved INSIDE the hashed sampler_config to make it safe: rung 4 could carry it
as a dispatcher flag only while it was a constant, and a per-row strength outside the hashed
payload would let two visibly different plates share one artifact identity.
Prescription 1 split, and the split is the finding. Conditioning a row on ITS OWN rung-4 plate
at denoise 0.60-0.75 does repair INVENTED artifacts while keeping the subject: row 32's rendered
badge, its ?, its 0, its ruled scale-bar and its duplicate silhouettes are all gone with the
quadrupedal Komodo intact; row 82's FL lettering is gone with the single tapering muzzle intact;
row 80's signboard lettering is gone. But it CANNOT repair a FRAMING defect, because a crop IS
composition and low denoise PRESERVES composition — row 43's child is still cropped at the
shoulders on a row whose whole job is standing height. **A lower denoise is the right lever for an
invented object and the wrong lever for a bad frame**, and rung 6 should not spend another seed
learning that twice.
The reference can BE the defect, and it must be opened before it is trusted. Row 75's
synthesized macaque staging was opened this rung and found to carry the bright red-pink spectacle
mask itself, on the white studio ground the row's collapsed doll-child scale also came from —
conditioning on it at a lower denoise would have propagated the very defect the row exists to
correct. The row ran LoRA-only on the row-77 precedent instead and PASSED on both cells: an even
muted grey-brown face, and an honest scale on real forest floor. Two of the belt's three best
identity results now used no reference at all. **Standing rule: a reference is looked at against
the row's own defect line before it is used, never after.**
Two rows regressed in the opposite direction, which is diagnosis rather than noise. Row 21 is
repaired — the boss is back in the boss pocket and the sulfur crust rung 4 won still holds. Row 42
is not, and it has now oscillated both ways: rung 4 bought the animal and lost the through-water
read, rung 5 bought the water completely and lost the animal to hard scute seams. The two
requirements are carried by two different mechanisms — the words carry the water, the reference
carries the animal — and denoise trades one against the other. **That row needs a reference whose
own composition is already right, not a different denoise.**
A word-sense collision was found and named. Rows 37 and 39 stage the hollow as a PROP — three
coopered barrels in 37, a hollow log in 39 — because the affirmative clause says the cavity opens
"straight through the living barrel itself", and BARREL reaches this model's CONTAINER sense before
it reaches the animal's trunk. Rung 4 recorded the same substitution as pipes-and-culverts without
naming the cause. The fix is lexical, not mechanical: say flank, ribcage or trunk.
The two ROUTED classes had no seed burned on them, and both now SAY so in
regeneration_trigger on the row and in the RECS amendment, naming Lane R, this section, and the
docs/FACTORY_CONTINUATION.md queue row — so the next reader does not rediscover the exhaustion.
The rung-5 plate ids were first minted on letter G, and PLT_G* is the ORIGINAL Lane-G
candidate namespace carrying 76 live rows. Four ids collided and the apply, which updates in place
on plate_id, silently OVERWROTE four rows — one of them (PLT_G018_1, the recovered realm object)
was complete. The builder had always asserted that no destination PATH collides and never that no
plate_id does, and a path check structurally cannot catch this: the path is keyed on the prompt
hash, so two different subjects collide on the ID while their paths differ. It was caught by the
apply's own new-row count (19 new for 23 plates), reverted from HEAD, and the builder now carries an
ID-COLLISION assertion that was mutation-tested — put back on letter G it names all four colliding
ids and refuses. The plate id is not inside the hashed payload, so re-minting on letter H left every
prompt_hash and every asset_path byte-identical and no GPU work was repeated.
docs/DOC_MAP.md — two rows: this ruling and the download manifest.docs/art_boards/README.md — the board tables this rung writes.docs/CONCEPT_ART_PRODUCTION_PROGRAM.md — the path law.