Map Krea2 sixty-nine and refine ready aftermath

This commit is contained in:
2026-06-29 08:34:12 +02:00
parent 03907439a4
commit b8e15289ca
3 changed files with 100 additions and 22 deletions
+48 -7
View File
@@ -262,19 +262,21 @@
"atlas_folders": ["ready"],
"action_family": "climax",
"position_keys": ["open_thighs", "camera_showing"],
"canonical_geometry": "First-person aftermath view: the woman reclines or sits back facing the viewer with thighs spread open, face and torso readable behind the open-leg frame, viewer body cue or recently withdrawn foreground cue near the lower edge, and visible aftermath fluid remaining at the central contact area.",
"canonical_geometry": "First-person post-ejaculation open-thigh display: the woman reclines or sits back facing the viewer with thighs spread open, face and torso readable behind the open-leg frame, viewer body cue or recently withdrawn foreground cue near the lower edge, and thick semen or fluid visibly coating or dripping around the exposed pussy or anal opening.",
"prompt_cues": [
"POV ejaculation aftermath open-thigh position",
"POV post-ejaculation open-thigh display pose",
"woman reclines or sits back facing the viewer with thighs spread open",
"visible aftermath fluid remains at the central contact area between her open thighs",
"thick semen or fluid is visible around the exposed pussy or anal opening",
"the body is still after ejaculation rather than actively thrusting",
"viewer body cue or recently withdrawn foreground cue stays near the lower edge",
"her face and torso remain visible behind the open-leg frame",
"thighs and knees frame the aftermath detail without hiding it"
"thighs and knees frame the wet aftermath detail without hiding it"
],
"avoid_cues": [
"generic ready/setup pose before sex",
"active thrusting or penetration-in-progress wording",
"turning the setup into oral, toy, or manual contact",
"generic wetness without visible aftermath fluid at the central area",
"generic wetness without thick visible fluid around the exposed opening",
"closed thighs hiding the aftermath detail",
"cropping out the face and torso behind the open-leg frame"
],
@@ -285,12 +287,12 @@
],
"generator_hook": {
"module": "krea_pov_actions.py",
"route_terms": ["ejaculation aftermath", "visible aftermath fluid", "open thighs"]
"route_terms": ["post-ejaculation open-thigh display", "thick visible semen or fluid", "open thighs"]
},
"evidence": {
"fixed_seed_tests": [],
"guide_section": "",
"notes": "The ready folder is post-contact open-thigh aftermath, not a neutral ready/setup pose; needs fixed-seed Krea2 tests before promotion to proven."
"notes": "The ready folder is a post-ejaculation open-thigh display pose with thick visible fluid around the exposed opening, not a neutral ready/setup pose; needs fixed-seed Krea2 tests before promotion to proven."
}
},
{
@@ -330,6 +332,45 @@
"notes": "Atlas shows a repeated open-thigh presentation/setup pose; needs fixed-seed Krea2 tests before promotion to proven."
}
},
{
"key": "pov_sixty_nine_close_reversed_oral",
"family": "sixty_nine",
"status": "unstable",
"atlas_folders": ["69"],
"action_family": "oral",
"position_keys": ["sixty_nine"],
"canonical_geometry": "Close first-person sixty-nine view: the visible partner is reversed over the viewer with hips closest to the camera, head and torso receding away into the upper frame, viewer face or mouth anchoring the lower foreground, and hands optionally holding the hips to keep the reversed body arrangement readable.",
"prompt_cues": [
"POV close sixty-nine position",
"visible partner is reversed over the viewer with hips closest to the camera",
"the partner's head and torso recede away into the upper frame",
"viewer face or mouth anchors the lower foreground under the partner's hips",
"viewer hands may hold the partner's hips without changing the reversed-over-viewer body arrangement",
"keep the mutual oral geometry readable as one continuous first-person frame"
],
"avoid_cues": [
"side-by-side sixty-nine layout",
"upright oral pose with the partner facing the viewer",
"generic oral contact without the reversed-over-viewer body arrangement",
"cropping away the head-and-torso direction that proves the sixty-nine setup",
"text-only prompting when exact geometry matters; prefer pose control or image guidance"
],
"reference_images": [
"69/105_sixtynine.png",
"69/106_sixtynine.png",
"69/50_sixtynine.png",
"69/80_sixtynine.png"
],
"generator_hook": {
"module": "krea_pov_actions.py",
"route_terms": ["sixty-nine", "reversed over viewer", "mutual oral"]
},
"evidence": {
"fixed_seed_tests": [],
"guide_section": "",
"notes": "Atlas geometry is consistent but visually fragile for text-only Krea2 prompting; keep this unstable until fixed-seed tests prove a reliable wording or a control-image route is wired."
}
},
{
"key": "pov_blowjob_top_down_vertical_shaft",
"family": "blowjob_top_view",
+20 -8
View File
@@ -29,8 +29,9 @@ unmapped by the catalog. Unmapped folders include sample pose/control image
paths and a suggested candidate key to start the next catalog entry.
The `ready` folder name is misleading for prompt planning: it is mapped as
`pov_ejaculation_aftermath_open_thigh_candidate`, an aftermath/open-thigh family
with visible fluid at the central contact area, not as a neutral setup pose.
`pov_ejaculation_aftermath_open_thigh_candidate`, a post-ejaculation
open-thigh display family with thick visible fluid around the exposed opening,
not as a neutral setup pose.
## Inventory
@@ -132,16 +133,16 @@ foreground with the rounded head pressed to the central contact point. Treat
evidence. Keep the visible hand/handle in the wording; otherwise Krea2 may float
the toy or transfer ownership to the visible partner.
### Ready / Open-Thigh Aftermath
### Ready / Post-Ejaculation Open-Thigh Display
The ready folder is not a neutral setup family. It repeats a first-person
aftermath view: the woman reclines or sits back facing the viewer with thighs
spread open, face and torso readable behind the open-leg frame, a viewer body cue
or recently withdrawn foreground cue near the lower edge, and visible aftermath
fluid at the central contact area. Treat
post-ejaculation display pose: the woman reclines or sits back facing the viewer
with thighs spread open, face and torso readable behind the open-leg frame, a
viewer body cue or recently withdrawn foreground cue near the lower edge, and
thick semen or fluid visible around the exposed pussy or anal opening. Treat
`pov_ejaculation_aftermath_open_thigh_candidate` as a candidate until it has
fixed-seed Krea2 evidence. Avoid active thrusting wording here; the key state is
post-contact visibility, not penetration-in-progress.
post-ejaculation fluid visibility, not penetration-in-progress.
### Spread / Open-Thigh Presentation
@@ -151,6 +152,17 @@ 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.
### Sixty-Nine / Close Reversed POV
The `69` folder repeats a close first-person mutual-oral layout rather than a
wide side-by-side pose: the visible partner is reversed over the viewer, hips
closest to camera, head and torso receding away into the upper frame, and the
viewer face or mouth anchoring the lower foreground. Treat
`pov_sixty_nine_close_reversed_oral` as unstable until fixed-seed tests prove a
reliable wording. When exact geometry matters, prefer a pose/control image or a
narrower image-guided route; text alone can collapse this into generic oral
contact or lose the reversed-over-viewer body arrangement.
### Blowjob Top View
The `blowjob_top_view` folder repeats a top-down first-person oral layout: the
+32 -7
View File
@@ -6828,6 +6828,7 @@ def smoke_krea2_pose_variant_catalog_policy() -> None:
oral = krea2_pose_variant_catalog.variant_keys(action_family="oral")
_expect(
oral == [
"pov_sixty_nine_close_reversed_oral",
"pov_blowjob_top_down_vertical_shaft",
"pov_blowjob_side_profile_oral",
"pov_blowjob_laying_frontal_oral",
@@ -6864,8 +6865,18 @@ def smoke_krea2_pose_variant_catalog_policy() -> None:
ready = krea2_pose_variant_catalog.get_variant("pov_ejaculation_aftermath_open_thigh_candidate")
_expect(ready.get("status") == "candidate", "Ready aftermath variant should remain a candidate until fixed-seed evidence exists")
_expect(
any("visible aftermath fluid remains at the central contact area" in str(cue) for cue in ready.get("prompt_cues", [])),
"Ready aftermath variant lost central fluid cue",
any("thick semen or fluid is visible around the exposed pussy or anal opening" in str(cue) for cue in ready.get("prompt_cues", [])),
"Ready aftermath variant lost explicit post-ejaculation fluid/opening cue",
)
_expect(
any("generic ready/setup pose before sex" in str(cue) for cue in ready.get("avoid_cues", [])),
"Ready aftermath variant should reject generic ready/setup wording",
)
sixty_nine = krea2_pose_variant_catalog.get_variant("pov_sixty_nine_close_reversed_oral")
_expect(sixty_nine.get("status") == "unstable", "Sixty-nine route should stay unstable until text-only evidence improves")
_expect(
any("visible partner is reversed over the viewer with hips closest" in str(cue) for cue in sixty_nine.get("prompt_cues", [])),
"Sixty-nine variant lost reversed-over-viewer cue",
)
spread = krea2_pose_variant_catalog.get_variant("pov_spread_open_thigh_presentation")
_expect(spread.get("status") == "candidate", "Spread variant should remain a candidate until fixed-seed evidence exists")
@@ -7002,6 +7013,9 @@ def smoke_krea2_tuning_report_policy() -> None:
ready = by_key.get("pov_ejaculation_aftermath_open_thigh_candidate") or {}
_expect(ready.get("coverage_state") == "needs_fixed_seed_tests", "Ready aftermath report should need fixed-seed tests")
_expect(ready.get("accepted_evidence_count") == 0, "Ready aftermath report should not have accepted evidence yet")
sixty_nine = by_key.get("pov_sixty_nine_close_reversed_oral") or {}
_expect(sixty_nine.get("coverage_state") == "needs_stronger_control", "Sixty-nine report should require stronger control")
_expect(sixty_nine.get("accepted_evidence_count") == 0, "Sixty-nine report should not have accepted evidence yet")
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")
@@ -7038,6 +7052,7 @@ def smoke_krea2_tuning_report_policy() -> None:
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") == 16, "Krea2 tuning report candidate count changed")
_expect(summary.get("status_counts", {}).get("unstable") == 1, "Krea2 tuning report unstable count changed")
_expect(
summary.get("variants_without_accepted_evidence") == [
"pov_ballsucking_low_head",
@@ -7046,6 +7061,7 @@ def smoke_krea2_tuning_report_policy() -> None:
"pov_wand_foreground_tool_contact",
"pov_ejaculation_aftermath_open_thigh_candidate",
"pov_spread_open_thigh_presentation",
"pov_sixty_nine_close_reversed_oral",
"pov_blowjob_top_down_vertical_shaft",
"pov_blowjob_side_profile_oral",
"pov_blowjob_laying_frontal_oral",
@@ -7060,6 +7076,10 @@ def smoke_krea2_tuning_report_policy() -> None:
f"Krea2 tuning report missing-evidence set changed: {summary.get('variants_without_accepted_evidence')}",
)
plans = krea2_tuning_report.next_test_plans()
_expect(
"pov_sixty_nine_close_reversed_oral" not in [plan.get("key") for plan in plans],
"Unstable sixty-nine route should not be queued as a normal fixed-seed candidate",
)
_expect(
[plan.get("key") for plan in plans]
== [
@@ -7125,8 +7145,8 @@ def smoke_krea2_tuning_report_policy() -> None:
)
ready_plan = plan_by_key["pov_ejaculation_aftermath_open_thigh_candidate"]
_expect(
"visible aftermath fluid remains at the central contact area" in " ".join(ready_plan.get("prompt_cues") or []),
"Ready aftermath test plan lost central fluid cue",
"thick semen or fluid is visible around the exposed pussy or anal opening" in " ".join(ready_plan.get("prompt_cues") or []),
"Ready aftermath test plan lost explicit post-ejaculation fluid/opening cue",
)
_expect(
any(str(path).endswith("ready/105_ready_.png") for path in ready_plan.get("reference_paths") or []),
@@ -7233,7 +7253,7 @@ def smoke_krea2_tuning_report_policy() -> None:
)
with tempfile.TemporaryDirectory() as tmpdir:
atlas_root = Path(tmpdir)
for folder in ("doggy", "doggy_control", "custom_pose", "custom_pose_control", "ready", "ready_control", "bg", "woman", "doggy_bg"):
for folder in ("doggy", "doggy_control", "custom_pose", "custom_pose_control", "ready", "ready_control", "69", "69_control", "bg", "woman", "doggy_bg"):
folder_path = atlas_root / folder
folder_path.mkdir()
(folder_path / f"{folder}_sample.png").write_bytes(b"")
@@ -7241,18 +7261,21 @@ def smoke_krea2_tuning_report_policy() -> None:
(atlas_root / "custom_pose_control" / "custom_pose_control_b.png").write_bytes(b"")
(atlas_root / "ready" / "ready_b.png").write_bytes(b"")
(atlas_root / "ready_control" / "ready_control_b.png").write_bytes(b"")
(atlas_root / "69" / "69_b.png").write_bytes(b"")
(atlas_root / "69_control" / "69_control_b.png").write_bytes(b"")
atlas_rows = krea2_tuning_report.atlas_folder_rows(atlas_root=atlas_root)
atlas_by_folder = {row.get("folder"): row for row in atlas_rows}
_expect(atlas_by_folder.get("doggy", {}).get("mapped") is True, "Atlas report should mark catalog folders as mapped")
_expect(atlas_by_folder.get("custom_pose", {}).get("mapped") is False, "Atlas report should expose unmapped pose folders")
_expect(atlas_by_folder.get("ready", {}).get("mapped") is True, "Atlas report should mark ready as mapped once cataloged")
_expect(atlas_by_folder.get("69", {}).get("mapped") is True, "Atlas report should mark sixty-nine as mapped once cataloged")
_expect("doggy_control" not in atlas_by_folder, "Atlas report should exclude control folders")
_expect("doggy_bg" not in atlas_by_folder, "Atlas report should exclude background folders")
_expect("bg" not in atlas_by_folder, "Atlas report should exclude shared bg folder")
_expect("woman" not in atlas_by_folder, "Atlas report should exclude non-pose woman folder")
atlas_summary = krea2_tuning_report.atlas_coverage_summary(atlas_root=atlas_root)
_expect(atlas_summary.get("pose_folder_count") == 3, "Atlas report should count only pose folders")
_expect(atlas_summary.get("mapped_folder_count") == 2, "Atlas report should count mapped pose folders")
_expect(atlas_summary.get("pose_folder_count") == 4, "Atlas report should count only pose folders")
_expect(atlas_summary.get("mapped_folder_count") == 3, "Atlas report should count mapped pose folders")
_expect(atlas_summary.get("unmapped_folders") == ["custom_pose"], "Atlas report should identify unmapped pose folders")
gap_plans = krea2_tuning_report.atlas_gap_plans(atlas_root=atlas_root, sample_limit=2)
_expect([plan.get("folder") for plan in gap_plans] == ["custom_pose"], "Atlas gap plans should follow unmapped folders")
@@ -7275,6 +7298,8 @@ def smoke_krea2_tuning_report_policy() -> None:
_expect("pov_fingering_reclined_open_thighs" in markdown, "Krea2 tuning report markdown lost fingering candidate variant")
_expect("pov_wand_foreground_tool_contact" in markdown, "Krea2 tuning report markdown lost wand candidate variant")
_expect("pov_ejaculation_aftermath_open_thigh_candidate" in markdown, "Krea2 tuning report markdown lost ready aftermath candidate variant")
_expect("pov_sixty_nine_close_reversed_oral" in markdown, "Krea2 tuning report markdown lost sixty-nine unstable variant")
_expect("needs_stronger_control" in markdown, "Krea2 tuning report markdown lost stronger-control coverage state")
_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("pov_blowjob_side_profile_oral" in markdown, "Krea2 tuning report markdown lost blowjob side candidate variant")