diff --git a/categories/krea2_pov_pose_variants.json b/categories/krea2_pov_pose_variants.json index 88919fa..02d4c99 100644 --- a/categories/krea2_pov_pose_variants.json +++ b/categories/krea2_pov_pose_variants.json @@ -559,6 +559,46 @@ "guide_section": "", "notes": "Atlas shows repeated frontal woman-on-top geometry with a lower seated squat and closer thigh/hand anchors than the main cowgirl folder; needs fixed-seed Krea2 tests before promotion to proven." } + }, + { + "key": "pov_reverse_cowgirl_back_facing_penetration", + "family": "reverse_cowgirl", + "status": "candidate", + "atlas_folders": ["cowgirl_reverse"], + "action_family": "penetration", + "position_keys": ["reverse_cowgirl", "back_facing_straddle", "woman_on_top"], + "canonical_geometry": "First-person reverse cowgirl view: the viewer reclines below while the woman straddles the viewer facing away, her back and hips dominate the frame, her knees or thighs sit to either side of the viewer's hips, and the viewer's thighs, pelvis, hands, or lower torso anchor the lower foreground.", + "prompt_cues": [ + "POV reverse cowgirl back-facing penetration position", + "woman faces away from the viewer in a back-facing straddle", + "her back, hips, and ass are closest to the camera while her face may turn over one shoulder", + "her knees or thighs are planted to either side of the viewer's hips", + "viewer reclines underneath with thighs, pelvis, or lower torso anchoring the foreground", + "viewer hands may hold her hips or thighs without changing the woman-on-top geometry" + ], + "avoid_cues": [ + "frontal cowgirl with the woman facing the viewer", + "missionary with the woman lying on her back", + "rear-entry or doggy geometry with the viewer behind her", + "woman on all fours", + "side-profile penetration without the back-facing straddle", + "cropping away the back, hips, and viewer-underneath foreground cues" + ], + "reference_images": [ + "cowgirl_reverse/101_cowgirl_reverse.png", + "cowgirl_reverse/104_cowgirl_reverse.png", + "cowgirl_reverse/106_cowgirl_reverse.png", + "cowgirl_reverse/1_cowgirl_reverse.png" + ], + "generator_hook": { + "module": "krea_pov_actions.py", + "route_terms": ["cowgirl_reverse", "reverse cowgirl", "back-facing straddle", "woman-on-top"] + }, + "evidence": { + "fixed_seed_tests": [], + "guide_section": "", + "notes": "Atlas shows repeated reverse cowgirl geometry with the viewer underneath and the woman facing away; needs fixed-seed Krea2 tests before promotion to proven." + } } ] } diff --git a/docs/krea2-pov-pose-atlas.md b/docs/krea2-pov-pose-atlas.md index 2b60853..cce26f2 100644 --- a/docs/krea2-pov-pose-atlas.md +++ b/docs/krea2-pov-pose-atlas.md @@ -199,3 +199,14 @@ of her thighs or hips. Treat `pov_cowgirl_alt_low_squat_penetration` as a candidate until it has fixed-seed Krea2 evidence. Keep this separate from the main cowgirl route so Krea2 can choose between upright straddle wording and closer seated-squat wording. + +### Reverse Cowgirl / Back-Facing Straddle Penetration + +The `cowgirl_reverse` folder repeats a woman-on-top first-person layout where +the viewer reclines underneath and the woman faces away from the viewer. Her +back, hips, and ass are the closest readable body anchors, with her knees or +thighs planted to either side of the viewer's hips; her face may turn back over +one shoulder. Treat `pov_reverse_cowgirl_back_facing_penetration` as a +candidate until it has fixed-seed Krea2 evidence. Keep it separate from doggy: +the viewer is underneath her in a back-facing straddle, not kneeling behind her +while she is on all fours. diff --git a/tools/prompt_smoke.py b/tools/prompt_smoke.py index 9c442e3..ced8c7f 100644 --- a/tools/prompt_smoke.py +++ b/tools/prompt_smoke.py @@ -6790,6 +6790,7 @@ def smoke_krea2_pose_variant_catalog_policy() -> None: "pov_missionary_folded_high_leg_penetration", "pov_cowgirl_frontal_straddle_penetration", "pov_cowgirl_alt_low_squat_penetration", + "pov_reverse_cowgirl_back_facing_penetration", ], f"Krea2 pose-variant penetration filtering changed unexpectedly: {penetration}", ) @@ -6897,6 +6898,12 @@ def smoke_krea2_pose_variant_catalog_policy() -> None: any("low seated squat over the viewer's pelvis" in str(cue) for cue in cowgirl_alt.get("prompt_cues", [])), "Cowgirl alt variant lost low seated squat cue", ) + reverse_cowgirl = krea2_pose_variant_catalog.get_variant("pov_reverse_cowgirl_back_facing_penetration") + _expect(reverse_cowgirl.get("status") == "candidate", "Reverse cowgirl variant should remain a candidate until fixed-seed evidence exists") + _expect( + any("woman faces away from the viewer in a back-facing straddle" in str(cue) for cue in reverse_cowgirl.get("prompt_cues", [])), + "Reverse cowgirl variant lost back-facing straddle cue", + ) refs = krea2_pose_variant_catalog.reference_paths("pov_boobjob_upright_cleavage") _expect(refs and all(path.name.endswith(".png") for path in refs), "Boobjob reference paths are not image paths") _expect(all("bg" not in str(path).lower() for path in refs), "Reference paths should not include background-only atlas images") @@ -6987,9 +6994,12 @@ def smoke_krea2_tuning_report_policy() -> None: cowgirl_alt = by_key.get("pov_cowgirl_alt_low_squat_penetration") or {} _expect(cowgirl_alt.get("coverage_state") == "needs_fixed_seed_tests", "Cowgirl alt report should need fixed-seed tests") _expect(cowgirl_alt.get("accepted_evidence_count") == 0, "Cowgirl alt report should not have accepted evidence yet") + reverse_cowgirl = by_key.get("pov_reverse_cowgirl_back_facing_penetration") or {} + _expect(reverse_cowgirl.get("coverage_state") == "needs_fixed_seed_tests", "Reverse cowgirl report should need fixed-seed tests") + _expect(reverse_cowgirl.get("accepted_evidence_count") == 0, "Reverse cowgirl report should not have accepted evidence yet") summary = krea2_tuning_report.coverage_summary() _expect(summary.get("status_counts", {}).get("proven") == 3, "Krea2 tuning report proven count changed") - _expect(summary.get("status_counts", {}).get("candidate") == 12, "Krea2 tuning report candidate count changed") + _expect(summary.get("status_counts", {}).get("candidate") == 13, "Krea2 tuning report candidate count changed") _expect( summary.get("variants_without_accepted_evidence") == [ "pov_ballsucking_low_head", @@ -7004,6 +7014,7 @@ def smoke_krea2_tuning_report_policy() -> None: "pov_missionary_folded_high_leg_penetration", "pov_cowgirl_frontal_straddle_penetration", "pov_cowgirl_alt_low_squat_penetration", + "pov_reverse_cowgirl_back_facing_penetration", ], f"Krea2 tuning report missing-evidence set changed: {summary.get('variants_without_accepted_evidence')}", ) @@ -7023,6 +7034,7 @@ def smoke_krea2_tuning_report_policy() -> None: "pov_missionary_folded_high_leg_penetration", "pov_cowgirl_frontal_straddle_penetration", "pov_cowgirl_alt_low_squat_penetration", + "pov_reverse_cowgirl_back_facing_penetration", ], "Krea2 tuning report next plans changed", ) @@ -7139,6 +7151,15 @@ def smoke_krea2_tuning_report_policy() -> None: any(str(path).endswith("5.cowgirl_alt/101_cowgirl_alt.png") for path in cowgirl_alt_plan.get("reference_paths") or []), "Cowgirl alt test plan lost atlas reference path", ) + reverse_cowgirl_plan = plan_by_key["pov_reverse_cowgirl_back_facing_penetration"] + _expect( + "woman faces away from the viewer in a back-facing straddle" in " ".join(reverse_cowgirl_plan.get("prompt_cues") or []), + "Reverse cowgirl test plan lost back-facing straddle cue", + ) + _expect( + any(str(path).endswith("cowgirl_reverse/101_cowgirl_reverse.png") for path in reverse_cowgirl_plan.get("reference_paths") or []), + "Reverse cowgirl test plan lost atlas reference path", + ) with tempfile.TemporaryDirectory() as tmpdir: atlas_root = Path(tmpdir) for folder in ("doggy", "doggy_control", "custom_pose", "custom_pose_control", "bg", "woman", "doggy_bg"): @@ -7182,6 +7203,7 @@ def smoke_krea2_tuning_report_policy() -> None: _expect("pov_missionary_folded_high_leg_penetration" in markdown, "Krea2 tuning report markdown lost folded missionary candidate variant") _expect("pov_cowgirl_frontal_straddle_penetration" in markdown, "Krea2 tuning report markdown lost cowgirl candidate variant") _expect("pov_cowgirl_alt_low_squat_penetration" in markdown, "Krea2 tuning report markdown lost cowgirl alt candidate variant") + _expect("pov_reverse_cowgirl_back_facing_penetration" in markdown, "Krea2 tuning report markdown lost reverse cowgirl candidate variant") _expect("needs_fixed_seed_tests" in markdown, "Krea2 tuning report markdown lost coverage state") _expect("Prompt cues" in markdown, "Krea2 tuning report markdown lost next-test cue section") _expect("Avoid cues" in markdown, "Krea2 tuning report markdown lost next-test avoid section")