diff --git a/tools/prompt_route_simulation.py b/tools/prompt_route_simulation.py index e7cc339..c5e3729 100644 --- a/tools/prompt_route_simulation.py +++ b/tools/prompt_route_simulation.py @@ -1273,11 +1273,11 @@ def _pair_seed_pose_reroll_check(seed: int) -> dict[str, Any]: ) -def _pair_seed_content_reroll_check(seed: int) -> dict[str, Any]: +def _pair_seed_clothing_reroll_check(seed: int) -> dict[str, Any]: return _pair_seed_reroll_check( seed, - name="pair_seed.content_reroll", - reroll_axis="content", + name="pair_seed.clothing_reroll", + reroll_axis="clothing", changed_fields=("soft_item",), stable_fields=( "shared_cast_descriptors", @@ -1432,7 +1432,7 @@ def _pair_seed_checks(seed: int) -> list[dict[str, Any]]: _pair_seed_determinism_check(seed), _pair_seed_person_reroll_check(seed), _pair_seed_scene_reroll_check(seed), - _pair_seed_content_reroll_check(seed), + _pair_seed_clothing_reroll_check(seed), _pair_seed_pose_reroll_check(seed), _pair_seed_expression_reroll_check(seed), _pair_seed_composition_reroll_check(seed), diff --git a/tools/prompt_smoke.py b/tools/prompt_smoke.py index 0877661..e02b4fd 100644 --- a/tools/prompt_smoke.py +++ b/tools/prompt_smoke.py @@ -649,10 +649,17 @@ def smoke_builtin_single() -> None: _expect(hair in str(krea_metadata.get("krea_prompt", "")), "Krea metadata-only built-in route lost hair") _expect(eyes in str(krea_metadata.get("krea_prompt", "")), "Krea metadata-only built-in route lost eyes") item_anchor = " ".join(re.findall(r"[a-z0-9]+", item.lower())[:3]) - pose_anchor = " ".join(re.findall(r"[a-z0-9]+", pose.lower())[:4]) + pose_anchor_tokens = [ + token + for token in re.findall(r"[a-z0-9]+", pose.lower()) + if token not in {"a", "an", "and", "both", "by", "in", "of", "on", "the", "to", "with"} + ][:4] sdxl_metadata_prompt = str(sdxl_metadata.get("sdxl_prompt", "")).lower() _expect(item_anchor in sdxl_metadata_prompt, "SDXL metadata-only built-in route lost explicit item") - _expect(pose_anchor in sdxl_metadata_prompt, "SDXL metadata-only built-in route lost explicit pose") + _expect( + bool(pose_anchor_tokens) and all(token in sdxl_metadata_prompt for token in pose_anchor_tokens), + "SDXL metadata-only built-in route lost explicit pose", + ) for body_tag in sdxl_tag_policy.split_tag_text(body_phrase): _expect(body_tag.lower() in sdxl_metadata_prompt, f"SDXL metadata-only built-in route lost body tag: {body_tag}") _expect(skin.lower() in sdxl_metadata_prompt, "SDXL metadata-only built-in route lost skin") @@ -1400,7 +1407,7 @@ def smoke_builder_prompt_route_policy() -> None: _expect(custom_trace.get("branch") == "custom", "Builder custom generation_trace lost branch") _expect(custom_trace.get("source") == "json_category", "Builder custom generation_trace lost source") _expect(custom_trace.get("category_slug") == "casual_clothes", "Builder custom generation_trace lost category slug") - _expect(custom_trace.get("content_seed_axis") == "content", "Builder custom generation_trace lost content axis") + _expect(custom_trace.get("content_seed_axis") == "clothing", "Builder custom generation_trace lost clothing axis") _expect(custom_trace.get("seed_axes", {}).get("content", {}).get("source") == "configured", "Builder custom generation_trace lost configured content seed") _expect(custom_trace.get("seed_axes", {}).get("content", {}).get("seed") == 3502, "Builder custom generation_trace lost content seed value") _expect("typed builder route marker" in typed_route.row.get("prompt", ""), "Builder prompt route lost extra positive") @@ -5880,6 +5887,8 @@ def smoke_category_subcategory_matrix() -> None: _expect(isinstance(row.get("position_keys"), list), f"{name}.position_keys missing") _expect(isinstance(row.get("item_template_metadata"), dict), f"{name}.item_template_metadata missing") _expect(row.get("item_template_metadata"), f"{name}.item_template_metadata should not be empty") + elif row_category_route.is_clothing_content_category(category, subcategory): + _expect(row.get("content_seed_axis") == "clothing", f"{name}.content_seed_axis should be clothing") else: _expect(row.get("content_seed_axis") == "content", f"{name}.content_seed_axis should be content") @@ -14745,7 +14754,7 @@ def smoke_prompt_route_simulation_policy() -> None: "pair_seed.locked_determinism", "pair_seed.person_reroll", "pair_seed.scene_reroll", - "pair_seed.content_reroll", + "pair_seed.clothing_reroll", "pair_seed.pose_reroll", "pair_seed.expression_reroll", "pair_seed.composition_reroll", @@ -14760,15 +14769,15 @@ def smoke_prompt_route_simulation_policy() -> None: for check_name in ( "pair_seed.person_reroll", "pair_seed.scene_reroll", - "pair_seed.content_reroll", + "pair_seed.clothing_reroll", "pair_seed.pose_reroll", "pair_seed.expression_reroll", "pair_seed.composition_reroll", ): _expect(pair_seed_checks[check_name].get("changed") is True, f"{check_name} should prove its axis can reroll") _expect( - pair_seed_checks["pair_seed.content_reroll"].get("changed") is True, - "Pair content reroll should prove soft outfit/content can reroll while hard action stays locked", + pair_seed_checks["pair_seed.clothing_reroll"].get("changed") is True, + "Pair clothing reroll should prove soft outfit can reroll while hard action stays locked", ) _expect( pair_seed_checks["pair_seed.pose_reroll"].get("changed") is True,