From 2a5e565ce77b4e197f6301f6c2e0f904a22b16fc Mon Sep 17 00:00:00 2001 From: Ethanfel Date: Sat, 27 Jun 2026 12:44:21 +0200 Subject: [PATCH] Guard generated formatter metadata flow --- sdxl_tag_policy.py | 1 + tools/prompt_smoke.py | 52 +++++++++++++++++++++++++++++++++++++++++++ 2 files changed, 53 insertions(+) diff --git a/sdxl_tag_policy.py b/sdxl_tag_policy.py index 3e23ec2..4cd93c0 100644 --- a/sdxl_tag_policy.py +++ b/sdxl_tag_policy.py @@ -34,6 +34,7 @@ def split_tag_text(text: Any) -> list[str]: text = clean(text) if not text: return [] + text = input_policy.strip_prompt_field_labels(text, field_labels=PROMPT_FIELD_LABELS) text = re.sub(r"\bWoman [A-Z]'s\b", "woman's", text) text = re.sub(r"\bMan [A-Z]'s\b", "man's", text) text = re.sub(r"\bWoman [A-Z]\b", "woman", text) diff --git a/tools/prompt_smoke.py b/tools/prompt_smoke.py index 5f36462..b3c38ec 100644 --- a/tools/prompt_smoke.py +++ b/tools/prompt_smoke.py @@ -5072,6 +5072,58 @@ def smoke_formatter_metadata_fixtures() -> None: _expect("krea readable anchor" not in caption_text, "Caption naturalizer leaked Krea formatter hint") _expect("sdxl route tag" not in caption_text, "Caption naturalizer leaked SDXL formatter hint") + generated = _prompt_row( + name="fixture_generated_formatter_invariants", + category="Casual clothes", + subcategory="Casual clothes / Smart casual", + seed=4101, + men_count=0, + character_cast=_character_cast_subjects(["woman"]), + camera_config=_orbit_camera(horizontal_angle=45, vertical_angle=0, zoom=5.5), + location_config=_coworking_location_config(), + ) + _expect_row_base(generated, "fixture_generated_formatter_invariants") + _expect(generated.get("source") == "json_category", "Generated formatter invariant should use category JSON route") + generated_metadata = _json(generated) + generated_item = _expect_text("fixture_generated_formatter_invariants.item", generated.get("item"), 8) + item_anchor = " ".join(generated_item.lower().split()[:3]) + + krea = krea_formatter.format_krea2_prompt("", metadata_json=generated_metadata, target="single") + krea_prompt = _expect_text("fixture_generated_formatter_invariants.krea_prompt", krea.get("krea_prompt"), 40).lower() + _expect("metadata" in krea.get("method", ""), "Generated Krea invariant did not use metadata") + _expect(item_anchor in krea_prompt, "Generated Krea prompt lost clothing/item metadata") + _expect("coworking lounge" in krea_prompt, "Generated Krea prompt lost scene metadata") + _expect("front-right quarter view" in krea_prompt, "Generated Krea prompt lost camera metadata") + + sdxl = sdxl_formatter.format_sdxl_prompt( + "", + metadata_json=generated_metadata, + target="single", + trigger=SdxlTrigger, + prepend_trigger=True, + ) + sdxl_prompt = _expect_text("fixture_generated_formatter_invariants.sdxl_prompt", sdxl.get("sdxl_prompt"), 40).lower() + _expect("metadata" in sdxl.get("method", ""), "Generated SDXL invariant did not use metadata") + _expect_trigger_once("fixture_generated_formatter_invariants.sdxl_prompt", sdxl.get("sdxl_prompt"), SdxlTrigger) + _expect(item_anchor in sdxl_prompt, "Generated SDXL prompt lost clothing/item metadata") + _expect("coworking lounge" in sdxl_prompt, "Generated SDXL prompt lost scene metadata") + _expect("front-right quarter view" in sdxl_prompt, "Generated SDXL prompt lost camera metadata") + for leaked_label in ("camera:", "composition:", "scene:", "setting:", "pose:", "clothing:"): + _expect(leaked_label not in sdxl_prompt, f"Generated SDXL prompt leaked raw label {leaked_label!r}") + + caption, method = caption_naturalizer.naturalize_caption( + "", + metadata_json=generated_metadata, + trigger=Trigger, + include_trigger=False, + caption_profile="training_dense", + ) + caption_text = _expect_text("fixture_generated_formatter_invariants.caption", caption, 40).lower() + _expect("metadata" in method, "Generated caption invariant did not use metadata") + _expect_trigger_once("fixture_generated_formatter_invariants.caption", caption, Trigger) + _expect(item_anchor in caption_text, "Generated training caption lost clothing/item metadata") + _expect("coworking lounge" in caption_text, "Generated training caption lost scene metadata") + def smoke_node_utility_registration() -> None: required_nodes = [