From 364c42103b729fee6f35f9580aabe9894c39ec59 Mon Sep 17 00:00:00 2001 From: Ethanfel Date: Mon, 29 Jun 2026 09:55:59 +0200 Subject: [PATCH] Preserve semen wording in Krea2 climax prompts --- docs/krea2-prompt-guide.md | 23 +++++++++++++++++++++++ hardcore_role_climax.py | 2 +- krea_action_climax.py | 2 +- tools/prompt_smoke.py | 7 +++++++ 4 files changed, 32 insertions(+), 2 deletions(-) diff --git a/docs/krea2-prompt-guide.md b/docs/krea2-prompt-guide.md index 962ee23..779f86d 100644 --- a/docs/krea2-prompt-guide.md +++ b/docs/krea2-prompt-guide.md @@ -123,6 +123,29 @@ Avoid generic fallback wording: Use generic wording only when no source outfit exists. +## Climax / Ejaculation Wording + +Krea2 needs the visible fluid action stated directly in climax routes. Keep +`semen` in the action sentence when the generator intends an ejaculation or +post-ejaculation image. + +Works better: + +- `the man ejaculates semen across her body` +- `visible semen lands across her body` +- `ejaculates semen across her lower back, ass, and thighs` + +Avoid relying only on softer aftermath wording: + +- `visible ejaculation` +- `visible orgasm aftermath` +- `cum on hands and body` + +Seed `42052` exposed this as a structural formatter issue: the route selected a +standing/kneeling climax pose, but the Krea prompt dropped `semen` and kept only +generic aftermath language. The generator now preserves direct `ejaculates +semen` wording for this path before the prompt reaches Krea2. + ## POV Outercourse ### Boobjob / Titjob diff --git a/hardcore_role_climax.py b/hardcore_role_climax.py index f4a3d93..ca71519 100644 --- a/hardcore_role_climax.py +++ b/hardcore_role_climax.py @@ -53,7 +53,7 @@ def build_climax_role_graph( if "kneeling with mouth open" in context: return f"{woman} kneels in front of {man} at hip height while {man} ejaculates semen onto her face, lips, and chest." if "kneeling in front of a standing partner" in context: - return f"{woman} kneels in front of {man} at hip height while {man} stands over her for visible ejaculation." + return f"{woman} kneels in front of {man} at hip height while {man} stands over her and ejaculates semen across her body." if "standing with cum on the body" in context: return f"{woman} stands braced in front of {man} while he stays close at hip level and ejaculates semen across her body." if "squatting on top of a partner" in context: diff --git a/krea_action_climax.py b/krea_action_climax.py index 4680d01..2a78e08 100644 --- a/krea_action_climax.py +++ b/krea_action_climax.py @@ -96,7 +96,7 @@ def climax_role_graph(role_graph: str, hard_item: str, axis_values: Any = None) if "kneeling with mouth open" in text: return "the woman kneels in front of the man at hip height as he ejaculates semen onto her face, lips, and chest" if "kneeling in front of a standing partner" in text: - return "the woman kneels in front of the man at hip height while he stands over her for visible ejaculation" + return "the woman kneels in front of the man at hip height while he stands over her and ejaculates semen across her body" if "standing with cum on the body" in text: return "the woman stands braced in front of the man while he stands close at hip level and ejaculates semen across her body" if "squatting on top of a partner" in text: diff --git a/tools/prompt_smoke.py b/tools/prompt_smoke.py index 58850f7..af1db42 100644 --- a/tools/prompt_smoke.py +++ b/tools/prompt_smoke.py @@ -7082,6 +7082,8 @@ def smoke_krea2_eval_log_policy() -> None: def smoke_krea2_prompt_guide_policy() -> None: guide = (ROOT / "docs" / "krea2-prompt-guide.md").read_text(encoding="utf-8") + _expect("## Climax / Ejaculation Wording" in guide, "Krea2 prompt guide lost climax wording section") + _expect("ejaculates semen" in guide, "Krea2 prompt guide lost explicit semen wording rule") _expect("## Stronger-Control / Low-Priority Cases" in guide, "Krea2 prompt guide lost stronger-control section") _expect("pov_sixty_nine_close_reversed_oral" in guide, "Krea2 prompt guide lost sixty-nine unstable route") _expect("hardest" in guide and "low-priority" in guide, "Krea2 prompt guide lost hardest low-priority wording") @@ -9132,6 +9134,11 @@ def smoke_prompt_route_simulation_policy() -> None: pair_seed_checks["pair_seed.pose_reroll"].get("changed") is True, "Pair pose reroll should prove soft pose or hard action can reroll while cast/scene axes stay locked", ) + climax_regression = prompt_route_simulation.run_simulation(seed=42052, include_prompts=False) + _expect( + climax_regression.get("summary", {}).get("issues") == 0, + f"Prompt route simulation climax regression reported issues: {climax_regression.get('issues')}", + ) sweep = prompt_route_simulation.run_simulation_sweep(seed=3901, count=3, seed_step=101, include_prompts=False) sweep_summary = sweep.get("summary") or {} sweep_quality = sweep.get("quality") or {}