diff --git a/docs/krea2-pov-pose-atlas.md b/docs/krea2-pov-pose-atlas.md new file mode 100644 index 0000000..1ad3c20 --- /dev/null +++ b/docs/krea2-pov-pose-atlas.md @@ -0,0 +1,67 @@ +# Krea2 POV Pose Atlas + +Local reference root: + +`/media/unraid/davinci/Qwen_edit_lora/POV/dataset_v2` + +Use this dataset as the pose-geometry reference for POV prompt tuning. The pose +folders contain rendered POV examples; matching `_control` folders contain the +solo/control image for the same pose family. Ignore `bg` and `*_bg` folders for +pose analysis; they are background plates without people. + +## Inventory + +| Family | Pose images | Control images | First sample | +| --- | ---: | ---: | --- | +| cowgirl | 63 | 63 | `5.cowgirl/100_cowgirl.png` | +| cowgirl alt | 62 | 62 | `5.cowgirl_alt/101_cowgirl_alt.png` | +| reverse cowgirl | 58 | 58 | `cowgirl_reverse/101_cowgirl_reverse.png` | +| reverse cowgirl alt | 50 | 50 | `cowgirl_reversere_alt/100_cowgirl_reversere_alt.png` | +| doggy | 57 | 57 | `doggy/101_doggy.png` | +| doggy alt | 45 | 45 | `doggy_alt/100_doggy_alt.png` | +| missionary | 74 | 74 | `missionary/101_missionary.png` | +| missionary folded | 12 | 12 | `missionary_folded/16_missionary_folded.png` | +| sixty-nine | 29 | 29 | `69/105_sixtynine.png` | +| ballsucking | 25 | 25 | `ballsucking/101_ballsucking.png` | +| blowjob laying | 42 | 42 | `blowjob_laying/101_blowjob_laying.png` | +| blowjob side | 17 | 17 | `blowjob_side/103_blowjob_side.png` | +| blowjob sitting | 27 | 27 | `blowjob_sitting/100_blowjob_sitting.png` | +| blowjob top view | 17 | 17 | `blowjob_top_view/102_blowjob_top_view.png` | +| boobjob | 11 | 11 | `boobjob/100_boobjob.png` | +| handjob | 24 | 24 | `handjob/18_handjob.png` | +| footjob | 2 | 2 | `footjob/59_footjob.png` | +| fingering | 10 | 10 | `fingering/103_fingering.png` | +| spread | 55 | 55 | `spread/100_spread_.png` | +| ready | 19 | 19 | `ready/105_ready_.png` | +| wand | 7 | 7 | `wand/106_wand_.png` | + +## Tuning Method + +For each pose family: + +1. Sample 5-10 pose images and 2-3 control images. +2. Write a compact geometry summary using only repeated visual facts. +3. Test one prompt variant with a fixed seed. +4. Test the same wording on a second seed or character. +5. Patch generator defaults only when the wording improvement repeats or the + generated prompt is structurally wrong before rendering. +6. Record the evidence in `docs/krea2-prompt-guide.md`. + +## Confirmed Notes + +### Doggy / Rear-Entry + +Dataset references show that visible POV thighs, lower torso, or pelvis can be +correct. They should be treated as natural foreground cues, not automatic +failures. + +Better Krea2 wording: + +- `top-down POV doggy position from behind` +- `camera looks down over the viewer's hands onto the woman's raised hips` +- `woman is on all fours with chest low, forearms folded, cheek turned sideways` +- `back arched, hips raised high toward the camera` +- `viewer hands hold her hips with natural lower-body POV cues in the foreground` + +Avoid using visible shoes or lower legs as the standing cue. In seed `65`, that +wording pulled Krea2 toward oral contact and weakened rear-entry geometry. diff --git a/docs/krea2-prompt-guide.md b/docs/krea2-prompt-guide.md index 54674ca..6a8f3e6 100644 --- a/docs/krea2-prompt-guide.md +++ b/docs/krea2-prompt-guide.md @@ -36,6 +36,11 @@ image can justify a prompt-only retry when the mismatch is obvious, but a generator rule needs either repeated evidence or a generated prompt that is structurally wrong before rendering. +When a workflow batches soft/hard prompts through an index switch, sidecar text +files may not be the exact prompt used for each rendered image. If the sidecar +and image disagree, inspect the PNG workflow metadata and the final text encode +input before patching the generator. + When reviewing an eval payload, log: - emitted seed, @@ -140,6 +145,44 @@ Avoid: - making `the viewer` the first subject before the visible character is established. +For POV climax wording, the fluid target must follow the pose before expression +tokens. Rear-entry, doggy, bent-over, face-down, and on-all-fours poses should +target the ass, thighs, and lower back even if the expression detail mentions +face, lips, mouth, or tongue. + +Evidence: + +- Dataset seed `52` generated an internally contradictory prompt: on-all-fours + rear-view positioning paired with a face/chest ejaculation target. +- Corrected seed `52` and follow-up seed `5202` both rendered the rear-view + target consistently when the wording used `across her ass, thighs, and lower + back` and kept the clothing state tied to the lower garment. + +### POV Doggy / Rear-Entry + +For doggy-style POV, visible viewer thighs, lower torso, or pelvis can be +correct. Real POV references often show them. The useful target is not removing +the viewer body, but making the body cues read as a standing or crouched +first-person viewpoint instead of a vague seated pose. + +To push the reference closer to a standing or crouched man looking down, use a +top-down rear-entry structure: + +- `top-down standing POV doggy position from behind` +- `camera looks down over the viewer's extended hands onto the woman's raised hips` +- `woman is on all fours with chest low, forearms folded, cheek turned sideways` +- `rear-entry penetration visible between raised hips` +- `face and mouth remain far ahead, clearly separated from the penis` + +Do not use visible shoes or lower legs as the standing cue. Seed `65` showed +that adding shoes/lower legs made Krea2 drift into oral contact and lose the +rear-entry geometry. + +Do not over-prompt `viewer torso and thighs outside frame`; seeds `65` and +`6602` showed Krea2 still draws lower-body POV cues, and real references support +that. Prefer framing them as plausible foreground body cues rather than trying +to suppress them. + ## Style Style should describe rendering, not camera mechanics. diff --git a/docs/sxcp-eval-loop.md b/docs/sxcp-eval-loop.md index a0bfdbc..a03623d 100644 --- a/docs/sxcp-eval-loop.md +++ b/docs/sxcp-eval-loop.md @@ -67,6 +67,29 @@ The request is sent on stdin. The command also receives: - Seed control/reproducibility - Overall Krea2 image usefulness +## POV Pose Atlas + +Use `/media/unraid/davinci/Qwen_edit_lora/POV/dataset_v2` as the local +reference atlas for POV pose geometry. The top-level pose folders contain real +POV examples, and matching `_control` folders contain solo/control versions. +Ignore `bg` and `*_bg` folders for pose rules; they are background plates +without people. Treat the pose image folders as the primary source for body +geometry; captions are optional and are not present for every folder. + +Suggested workflow: + +1. Choose one pose family, for example `doggy`, `doggy_alt`, `cowgirl`, or + `missionary`. +2. Sample 5-10 real pose images and their control images. +3. Write the repeated geometry as a compact prompt rule. +4. Run one fixed-seed Krea2 prompt using that rule. +5. Repeat on a second seed or character before changing generator defaults. +6. If the prompt itself is structurally contradictory before rendering, patch + immediately and add a regression test. + +For POV doggy, the atlas shows that visible viewer thighs, lower torso, or +pelvis can be correct. Do not treat them as automatic failures. + ## Seed Contract The seed is transport metadata, not prompt text. When the graph emits a seed, an diff --git a/krea_pov_actions.py b/krea_pov_actions.py index 87f0121..78f569d 100644 --- a/krea_pov_actions.py +++ b/krea_pov_actions.py @@ -36,12 +36,30 @@ def _clean(value: Any) -> str: def pov_ejaculation_target(context: str) -> str: - if any(token in context for token in ("face", "mouth", "lips", "tongue", "chin")): - return "onto her face and chest" - if any(token in context for token in ("lower back", "ass", "rear-entry", "face-down", "bent-over", "doggy")): + if any( + token in context + for token in ( + "lower back", + "ass", + "rear-entry", + "rear entry", + "face-down", + "face down", + "bent-over", + "bent over", + "doggy", + "on all fours", + "hips high", + "hips raised", + "raised ass", + "behind her", + ) + ): return "across her ass, thighs, and lower back" if any(token in context for token in ("pussy", "open thighs", "thighs", "legs open")): return "across her pussy and thighs" + if any(token in context for token in ("face", "mouth", "lips", "tongue", "chin")): + return "onto her face and chest" return "onto her body" @@ -444,8 +462,9 @@ def pov_hardcore_pose_sentence( ) if "doggy" in position_context or "all fours" in position_context or "rear-entry" in position_context: return sentence( - "The woman is seen from behind with her ass raised toward the POV viewer, on all fours directly in front of him with hips high and back arched; " - f"the viewer looks down at her raised ass with his hands on her hips in the foreground {contact}" + "Top-down POV doggy position from behind: the camera looks down over the viewer's hands onto the woman's raised hips; " + f"the woman is on all fours with chest low, forearms folded, cheek turned sideways far ahead, back arched, and hips raised high toward the camera; " + f"the viewer's hands hold her hips with natural lower-body POV cues in the foreground {contact}" ) if "kneeling" in position_context: return sentence( diff --git a/tools/prompt_smoke.py b/tools/prompt_smoke.py index 5e38f8a..ea25f9c 100644 --- a/tools/prompt_smoke.py +++ b/tools/prompt_smoke.py @@ -55,6 +55,7 @@ import node_tooltips # noqa: E402 import krea_cast # noqa: E402 import krea_action_details # noqa: E402 import krea_action_context # noqa: E402 +import krea_pov_actions # noqa: E402 import krea_configured_cast_formatter # noqa: E402 import krea_format_route # noqa: E402 import krea_formatter # noqa: E402 @@ -6942,6 +6943,28 @@ def smoke_pov_oral_position_routes() -> None: _expect(term in prompt, f"{name} Krea prompt missing {term!r}: {prompt}") +def smoke_pov_climax_target_policy() -> None: + context = ( + "doggy rear-entry on all fours with hips raised and ass toward the camera; " + "mouth, face, lips, and tongue appear only in expression detail" + ) + target = krea_pov_actions.pov_ejaculation_target(context) + _expect( + target == "across her ass, thighs, and lower back", + f"rear-entry climax target should beat face-expression tokens, got {target!r}", + ) + phrase = krea_pov_actions.pov_action_phrase( + "Man A ejaculates semen onto Woman A's face and chest; visible semen lands while her mouth stays open", + ["Man A"], + role_graph="Woman A is on all fours directly in front of Man A with hips raised while Man A is positioned behind her.", + hard_item="cumshot with mouth and face expression", + composition="first-person rear-view frame looking down at the woman's raised ass", + axis_values={"position": "doggy style position"}, + ).lower() + _expect("face and chest" not in phrase, f"POV rear-entry climax kept incompatible face/chest target: {phrase}") + _expect("across her ass, thighs, and lower back" in phrase, f"POV rear-entry climax lost rear target: {phrase}") + + def smoke_pov_penetration_position_routes() -> None: cases = [ ( @@ -6966,7 +6989,7 @@ def smoke_pov_penetration_position_routes() -> None: "pov_penetration_doggy", "doggy", ("woman a is on all fours", "man a is positioned behind her"), - ("ass raised toward the pov viewer", "on all fours", "penetrates her pussy"), + ("top-down pov doggy position", "on all fours", "forearms folded", "penetrates her pussy"), ), ( "pov_penetration_edge_supported", @@ -7030,7 +7053,7 @@ def smoke_pov_anal_position_routes() -> None: "pov_anal_doggy", "doggy", ("on all fours", "positioned behind her"), - ("on all fours directly in front", "penetrates her ass"), + ("top-down pov doggy position", "on all fours", "forearms folded", "penetrates her ass"), ), ( "pov_anal_bent_over", @@ -9658,6 +9681,7 @@ SMOKE_CASES: list[tuple[str, Callable[[], None]]] = [ ("krea_pov_penetration_route", smoke_krea_pov_penetration_route), ("pov_outercourse_position_routes", smoke_pov_outercourse_position_routes), ("pov_oral_position_routes", smoke_pov_oral_position_routes), + ("pov_climax_target_policy", smoke_pov_climax_target_policy), ("pov_penetration_position_routes", smoke_pov_penetration_position_routes), ("pov_anal_position_routes", smoke_pov_anal_position_routes), ("double_front_back_route", smoke_double_front_back_route),