From 00e371e4b69b60594084664b72b3900de91a236d Mon Sep 17 00:00:00 2001 From: Ethanfel Date: Mon, 29 Jun 2026 05:09:40 +0200 Subject: [PATCH] Add Krea2 blowjob top-view candidate --- categories/krea2_pov_pose_variants.json | 38 +++++++++++++++++++++++++ docs/krea2-pov-pose-atlas.md | 9 ++++++ tools/prompt_smoke.py | 28 +++++++++++++++++- 3 files changed, 74 insertions(+), 1 deletion(-) diff --git a/categories/krea2_pov_pose_variants.json b/categories/krea2_pov_pose_variants.json index 0b4d951..7324afa 100644 --- a/categories/krea2_pov_pose_variants.json +++ b/categories/krea2_pov_pose_variants.json @@ -253,6 +253,44 @@ "guide_section": "", "notes": "Atlas shows a repeated open-thigh presentation/setup pose; needs fixed-seed Krea2 tests before promotion to proven." } + }, + { + "key": "pov_blowjob_top_down_vertical_shaft", + "family": "blowjob_top_view", + "status": "candidate", + "atlas_folders": ["blowjob_top_view"], + "action_family": "oral", + "position_keys": ["reclining_oral", "penis_licking"], + "canonical_geometry": "Top-down first-person oral view: the viewer looks down from chest or pelvis height, viewer torso or thighs stay at the lower edge, shaft is vertical and centered in the foreground, and the woman kneels below looking upward with mouth and hand aligned to the shaft.", + "prompt_cues": [ + "POV top-down oral position", + "viewer looks down from chest or pelvis height", + "viewer torso or thighs stay at the lower edge", + "shaft is vertical and centered in the foreground", + "woman kneels below the viewer looking upward", + "her mouth and hand align to the centered shaft" + ], + "avoid_cues": [ + "side-view oral framing", + "woman standing level with the viewer", + "shaft angled sideways or cropped away from the mouth", + "hands replacing the mouth as the main oral contact", + "camera placed behind the woman instead of above the viewer" + ], + "reference_images": [ + "blowjob_top_view/102_blowjob_top_view.png", + "blowjob_top_view/2_blowjob_top_view.png", + "blowjob_top_view/85_blowjob_top_view.png" + ], + "generator_hook": { + "module": "krea_pov_actions.py", + "route_terms": ["blowjob_top_view", "top-down oral", "oral"] + }, + "evidence": { + "fixed_seed_tests": [], + "guide_section": "", + "notes": "Atlas shows a repeated top-down oral POV with a centered vertical shaft; 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 f3249be..05bc520 100644 --- a/docs/krea2-pov-pose-atlas.md +++ b/docs/krea2-pov-pose-atlas.md @@ -125,3 +125,12 @@ action: the woman faces the camera with legs raised or knees held wide, thighs forming a wide V-frame, and her face and torso visible behind the open-leg pose. Treat `pov_spread_open_thigh_presentation` as a candidate until it has fixed-seed Krea2 evidence. + +### Blowjob Top View + +The `blowjob_top_view` folder repeats a top-down first-person oral layout: the +viewer looks down from chest or pelvis height, viewer torso or thighs sit at the +lower edge, the shaft is vertical and centered, and the woman kneels below +looking upward with mouth and hand aligned to it. Treat +`pov_blowjob_top_down_vertical_shaft` as a candidate until it has fixed-seed +Krea2 evidence. diff --git a/tools/prompt_smoke.py b/tools/prompt_smoke.py index d547d41..0de8f72 100644 --- a/tools/prompt_smoke.py +++ b/tools/prompt_smoke.py @@ -6802,6 +6802,11 @@ def smoke_krea2_pose_variant_catalog_policy() -> None: interaction == ["pov_spread_open_thigh_presentation"], f"Krea2 pose-variant interaction filtering changed unexpectedly: {interaction}", ) + oral = krea2_pose_variant_catalog.variant_keys(action_family="oral") + _expect( + oral == ["pov_blowjob_top_down_vertical_shaft"], + f"Krea2 pose-variant oral filtering changed unexpectedly: {oral}", + ) handjob = krea2_pose_variant_catalog.get_variant("pov_handjob_upright_centered") _expect( any("woman's right hand wraps" in str(cue) for cue in handjob.get("prompt_cues", [])), @@ -6828,6 +6833,12 @@ def smoke_krea2_pose_variant_catalog_policy() -> None: any("legs raised or knees held wide" in str(cue) for cue in spread.get("prompt_cues", [])), "Spread variant lost open-thigh cue", ) + oral_top = krea2_pose_variant_catalog.get_variant("pov_blowjob_top_down_vertical_shaft") + _expect(oral_top.get("status") == "candidate", "Blowjob top-view variant should remain a candidate until fixed-seed evidence exists") + _expect( + any("shaft is vertical and centered" in str(cue) for cue in oral_top.get("prompt_cues", [])), + "Blowjob top-view variant lost vertical-shaft 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") @@ -6894,15 +6905,19 @@ def smoke_krea2_tuning_report_policy() -> None: spread = by_key.get("pov_spread_open_thigh_presentation") or {} _expect(spread.get("coverage_state") == "needs_fixed_seed_tests", "Spread report should need fixed-seed tests") _expect(spread.get("accepted_evidence_count") == 0, "Spread report should not have accepted evidence yet") + oral_top = by_key.get("pov_blowjob_top_down_vertical_shaft") or {} + _expect(oral_top.get("coverage_state") == "needs_fixed_seed_tests", "Blowjob top-view report should need fixed-seed tests") + _expect(oral_top.get("accepted_evidence_count") == 0, "Blowjob top-view 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") == 4, "Krea2 tuning report candidate count changed") + _expect(summary.get("status_counts", {}).get("candidate") == 5, "Krea2 tuning report candidate count changed") _expect( summary.get("variants_without_accepted_evidence") == [ "pov_ballsucking_low_head", "pov_footjob_frontal_sole_stroke", "pov_fingering_reclined_open_thighs", "pov_spread_open_thigh_presentation", + "pov_blowjob_top_down_vertical_shaft", ], f"Krea2 tuning report missing-evidence set changed: {summary.get('variants_without_accepted_evidence')}", ) @@ -6914,6 +6929,7 @@ def smoke_krea2_tuning_report_policy() -> None: "pov_footjob_frontal_sole_stroke", "pov_fingering_reclined_open_thighs", "pov_spread_open_thigh_presentation", + "pov_blowjob_top_down_vertical_shaft", ], "Krea2 tuning report next plans changed", ) @@ -6958,6 +6974,15 @@ def smoke_krea2_tuning_report_policy() -> None: any(str(path).endswith("spread/100_spread_.png") for path in spread_plan.get("reference_paths") or []), "Spread test plan lost atlas reference path", ) + oral_top_plan = plan_by_key["pov_blowjob_top_down_vertical_shaft"] + _expect( + "shaft is vertical and centered" in " ".join(oral_top_plan.get("prompt_cues") or []), + "Blowjob top-view test plan lost vertical-shaft cue", + ) + _expect( + any(str(path).endswith("blowjob_top_view/102_blowjob_top_view.png") for path in oral_top_plan.get("reference_paths") or []), + "Blowjob top-view 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"): @@ -6993,6 +7018,7 @@ def smoke_krea2_tuning_report_policy() -> None: _expect("pov_footjob_frontal_sole_stroke" in markdown, "Krea2 tuning report markdown lost footjob candidate variant") _expect("pov_fingering_reclined_open_thighs" in markdown, "Krea2 tuning report markdown lost fingering candidate variant") _expect("pov_spread_open_thigh_presentation" in markdown, "Krea2 tuning report markdown lost spread candidate variant") + _expect("pov_blowjob_top_down_vertical_shaft" in markdown, "Krea2 tuning report markdown lost blowjob top-view 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")