From 2a29fcdfbb6be59f9e72f11a971095bc8960e39b Mon Sep 17 00:00:00 2001 From: Ethanfel Date: Mon, 29 Jun 2026 05:48:59 +0200 Subject: [PATCH] Add Krea2 blowjob sitting candidate --- categories/krea2_pov_pose_variants.json | 38 +++++++++++++++++++++++++ docs/krea2-pov-pose-atlas.md | 9 ++++++ tools/prompt_smoke.py | 24 +++++++++++++++- 3 files changed, 70 insertions(+), 1 deletion(-) diff --git a/categories/krea2_pov_pose_variants.json b/categories/krea2_pov_pose_variants.json index b18de97..81e4ffd 100644 --- a/categories/krea2_pov_pose_variants.json +++ b/categories/krea2_pov_pose_variants.json @@ -367,6 +367,44 @@ "guide_section": "", "notes": "Atlas shows repeated prone, front-facing first-person oral geometry; needs fixed-seed Krea2 tests before promotion to proven." } + }, + { + "key": "pov_blowjob_sitting_upright_oral", + "family": "blowjob_sitting", + "status": "candidate", + "atlas_folders": ["blowjob_sitting"], + "action_family": "oral", + "position_keys": ["reclining_oral", "penis_licking"], + "canonical_geometry": "Upright seated first-person oral view: the viewer reclines with open thighs framing the lower foreground, the woman sits upright between the viewer's open thighs, and her close front-facing mouth aligns to a vertical shaft centered between the viewer's legs.", + "prompt_cues": [ + "POV upright sitting oral position", + "viewer reclines with open thighs framing the lower foreground", + "woman sits upright between the viewer's open thighs", + "her shoulders and face stay vertical and close to the camera", + "vertical shaft centered between the viewer's legs", + "her mouth aligns to the centered shaft with hands low near the base" + ], + "avoid_cues": [ + "prone belly-down oral framing", + "side-profile oral framing", + "top-down oral framing from above the viewer", + "woman standing level with the viewer", + "cropping away the viewer's open-thigh frame" + ], + "reference_images": [ + "blowjob_sitting/100_blowjob_sitting.png", + "blowjob_sitting/24_blowjob_sitting.png", + "blowjob_sitting/58_blowjob_sitting.png" + ], + "generator_hook": { + "module": "krea_pov_actions.py", + "route_terms": ["blowjob_sitting", "upright sitting oral", "oral"] + }, + "evidence": { + "fixed_seed_tests": [], + "guide_section": "", + "notes": "Atlas contains some top-view outliers, but the named sitting files show repeated upright, front-facing first-person oral geometry; 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 9df2d3d..49f2d31 100644 --- a/docs/krea2-pov-pose-atlas.md +++ b/docs/krea2-pov-pose-atlas.md @@ -151,3 +151,12 @@ lies belly-down between the viewer's thighs, and her front-facing mouth and hands align to a shaft rising from the lower center of the frame. Treat `pov_blowjob_laying_frontal_oral` as a candidate until it has fixed-seed Krea2 evidence. + +### Blowjob Sitting + +The `blowjob_sitting` folder includes a few top-view outliers, but the named +sitting files repeat an upright seated first-person oral layout: the viewer +reclines with open thighs framing the lower foreground, the woman sits upright +between the viewer's thighs, and her close front-facing mouth aligns to a +vertical centered shaft. Treat `pov_blowjob_sitting_upright_oral` as a candidate +until it has fixed-seed Krea2 evidence. diff --git a/tools/prompt_smoke.py b/tools/prompt_smoke.py index 996f563..11d1556 100644 --- a/tools/prompt_smoke.py +++ b/tools/prompt_smoke.py @@ -6808,6 +6808,7 @@ def smoke_krea2_pose_variant_catalog_policy() -> None: "pov_blowjob_top_down_vertical_shaft", "pov_blowjob_side_profile_oral", "pov_blowjob_laying_frontal_oral", + "pov_blowjob_sitting_upright_oral", ], f"Krea2 pose-variant oral filtering changed unexpectedly: {oral}", ) @@ -6855,6 +6856,12 @@ def smoke_krea2_pose_variant_catalog_policy() -> None: any("woman lies belly-down between the viewer's open thighs" in str(cue) for cue in oral_laying.get("prompt_cues", [])), "Blowjob laying variant lost prone frontal cue", ) + oral_sitting = krea2_pose_variant_catalog.get_variant("pov_blowjob_sitting_upright_oral") + _expect(oral_sitting.get("status") == "candidate", "Blowjob sitting variant should remain a candidate until fixed-seed evidence exists") + _expect( + any("woman sits upright between the viewer's open thighs" in str(cue) for cue in oral_sitting.get("prompt_cues", [])), + "Blowjob sitting variant lost upright sitting 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") @@ -6930,9 +6937,12 @@ def smoke_krea2_tuning_report_policy() -> None: oral_laying = by_key.get("pov_blowjob_laying_frontal_oral") or {} _expect(oral_laying.get("coverage_state") == "needs_fixed_seed_tests", "Blowjob laying report should need fixed-seed tests") _expect(oral_laying.get("accepted_evidence_count") == 0, "Blowjob laying report should not have accepted evidence yet") + oral_sitting = by_key.get("pov_blowjob_sitting_upright_oral") or {} + _expect(oral_sitting.get("coverage_state") == "needs_fixed_seed_tests", "Blowjob sitting report should need fixed-seed tests") + _expect(oral_sitting.get("accepted_evidence_count") == 0, "Blowjob sitting 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") == 7, "Krea2 tuning report candidate count changed") + _expect(summary.get("status_counts", {}).get("candidate") == 8, "Krea2 tuning report candidate count changed") _expect( summary.get("variants_without_accepted_evidence") == [ "pov_ballsucking_low_head", @@ -6942,6 +6952,7 @@ def smoke_krea2_tuning_report_policy() -> None: "pov_blowjob_top_down_vertical_shaft", "pov_blowjob_side_profile_oral", "pov_blowjob_laying_frontal_oral", + "pov_blowjob_sitting_upright_oral", ], f"Krea2 tuning report missing-evidence set changed: {summary.get('variants_without_accepted_evidence')}", ) @@ -6956,6 +6967,7 @@ def smoke_krea2_tuning_report_policy() -> None: "pov_blowjob_top_down_vertical_shaft", "pov_blowjob_side_profile_oral", "pov_blowjob_laying_frontal_oral", + "pov_blowjob_sitting_upright_oral", ], "Krea2 tuning report next plans changed", ) @@ -7027,6 +7039,15 @@ def smoke_krea2_tuning_report_policy() -> None: any(str(path).endswith("blowjob_laying/101_blowjob_laying.png") for path in oral_laying_plan.get("reference_paths") or []), "Blowjob laying test plan lost atlas reference path", ) + oral_sitting_plan = plan_by_key["pov_blowjob_sitting_upright_oral"] + _expect( + "woman sits upright between the viewer's open thighs" in " ".join(oral_sitting_plan.get("prompt_cues") or []), + "Blowjob sitting test plan lost upright sitting cue", + ) + _expect( + any(str(path).endswith("blowjob_sitting/100_blowjob_sitting.png") for path in oral_sitting_plan.get("reference_paths") or []), + "Blowjob sitting 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"): @@ -7065,6 +7086,7 @@ def smoke_krea2_tuning_report_policy() -> None: _expect("pov_blowjob_top_down_vertical_shaft" in markdown, "Krea2 tuning report markdown lost blowjob top-view candidate variant") _expect("pov_blowjob_side_profile_oral" in markdown, "Krea2 tuning report markdown lost blowjob side candidate variant") _expect("pov_blowjob_laying_frontal_oral" in markdown, "Krea2 tuning report markdown lost blowjob laying candidate variant") + _expect("pov_blowjob_sitting_upright_oral" in markdown, "Krea2 tuning report markdown lost blowjob sitting 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")