Add Krea2 blowjob sitting candidate

This commit is contained in:
2026-06-29 05:48:59 +02:00
parent 607c612196
commit 2a29fcdfbb
3 changed files with 70 additions and 1 deletions
+38
View File
@@ -367,6 +367,44 @@
"guide_section": "", "guide_section": "",
"notes": "Atlas shows repeated prone, front-facing first-person oral geometry; needs fixed-seed Krea2 tests before promotion to proven." "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."
}
} }
] ]
} }
+9
View File
@@ -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 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 `pov_blowjob_laying_frontal_oral` as a candidate until it has fixed-seed Krea2
evidence. 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.
+23 -1
View File
@@ -6808,6 +6808,7 @@ def smoke_krea2_pose_variant_catalog_policy() -> None:
"pov_blowjob_top_down_vertical_shaft", "pov_blowjob_top_down_vertical_shaft",
"pov_blowjob_side_profile_oral", "pov_blowjob_side_profile_oral",
"pov_blowjob_laying_frontal_oral", "pov_blowjob_laying_frontal_oral",
"pov_blowjob_sitting_upright_oral",
], ],
f"Krea2 pose-variant oral filtering changed unexpectedly: {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", [])), 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", "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") 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(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") _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 {} 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("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") _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() 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("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( _expect(
summary.get("variants_without_accepted_evidence") == [ summary.get("variants_without_accepted_evidence") == [
"pov_ballsucking_low_head", "pov_ballsucking_low_head",
@@ -6942,6 +6952,7 @@ def smoke_krea2_tuning_report_policy() -> None:
"pov_blowjob_top_down_vertical_shaft", "pov_blowjob_top_down_vertical_shaft",
"pov_blowjob_side_profile_oral", "pov_blowjob_side_profile_oral",
"pov_blowjob_laying_frontal_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')}", 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_top_down_vertical_shaft",
"pov_blowjob_side_profile_oral", "pov_blowjob_side_profile_oral",
"pov_blowjob_laying_frontal_oral", "pov_blowjob_laying_frontal_oral",
"pov_blowjob_sitting_upright_oral",
], ],
"Krea2 tuning report next plans changed", "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 []), 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", "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: with tempfile.TemporaryDirectory() as tmpdir:
atlas_root = Path(tmpdir) atlas_root = Path(tmpdir)
for folder in ("doggy", "doggy_control", "custom_pose", "custom_pose_control", "bg", "woman", "doggy_bg"): 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_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_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_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("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("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") _expect("Avoid cues" in markdown, "Krea2 tuning report markdown lost next-test avoid section")