ART_CONSISTENCY_MECHANISM_RULING_2026-08-04.md

decisions/ART_CONSISTENCY_MECHANISM_RULING_2026-08-04.md

THE ART CONSISTENCY MECHANISM — ruled, built, validated, applied

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.

1. The question this exists to answer

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.

2. THE RULING

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 classrowswhat is wrongmechanism ruled
manufactured_intrusion30a rivet, a screw, a graded road, a concrete kerb, corrugated roofing, a machine-printed sarong — manufactured material where the region owes wild or handmadestyle LoRA + clustered affirmative fix
identity_species9the 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 cleatsreference conditioning
garment_dress4a bare chest, a modern knit, a machine-printed cloth against a stated garment lawstyle LoRA + clustered affirmative fix
plate_register2an elevation where the row owes a section; four basins where the caldera owes threestyle LoRA + clustered affirmative fix
material_render2sulfur as plastic tubes; a figured motif on cloth ruled plainstyle 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."

2a. The finding that sharpens it — a reference is only as good as the reference

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:**

horizontal, forked yellow tongue. USABLE.

banded tail. USABLE.

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.

3. What was built

Training stack — chosen because it runs on this box today, not because it is fashionable.

piecepicklicenceevidence
trainerexamples/dreambooth/train_dreambooth_lora_z_image.py from diffusers @ tag v0.39.0Apache-2.0GitHub API license.spdx_id, re-fetched 2026-08-04
base weightsTongyi-MAI/Z-Image-Turbo @ f332072aa78be7aecdf3ee76d5c247082da564a6Apache-2.0HF API cardData.license, re-fetched 2026-08-04
runtimethe 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
addeddatasets 5.0.1Apache-2.0PyPI 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.

4. How the payload carries it — nothing smuggled

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.

5. The graph

The proven rung-1..3 graph, with exactly two additions:

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.

6. Validation before application

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.

7. Artifacts

8. WHAT THE MECHANISM ACTUALLY DID — the numbers, from the LOOK

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 classrowslandednote
manufactured_intrusion3017the 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_dress43
identity_species92rows 41 (softshell, on a staged reference) and 77 (cloven hoof, on NO reference)
material_render20
plate_register20

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.

8a. RUNG 5 — the prescriptions executed, and what they proved (2026-08-04)

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 defect this rung caught in its own tooling

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.

9. Where this is indexed

Generated by harness/site/structure_site.py — the URL path is the repo path. review root