diff --git a/categories/krea2_pov_pose_variants.json b/categories/krea2_pov_pose_variants.json index 81b6f73..8a0393e 100644 --- a/categories/krea2_pov_pose_variants.json +++ b/categories/krea2_pov_pose_variants.json @@ -336,6 +336,9 @@ "key": "pov_sixty_nine_close_reversed_oral", "family": "sixty_nine", "status": "unstable", + "difficulty": "hardest", + "priority": "low", + "control_requirement": "pose_or_image_guidance_first", "atlas_folders": ["69"], "action_family": "oral", "position_keys": ["sixty_nine"], @@ -368,7 +371,7 @@ "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." + "notes": "Lowest-priority atlas route for now: geometry is consistent but visually fragile for text-only Krea2 prompting. Treat it as a pose/control-image or image-guidance-first case, not a normal prompt-only fixed-seed candidate." } }, { diff --git a/docs/krea2-pov-pose-atlas.md b/docs/krea2-pov-pose-atlas.md index 55b5dd3..1923f75 100644 --- a/docs/krea2-pov-pose-atlas.md +++ b/docs/krea2-pov-pose-atlas.md @@ -158,10 +158,11 @@ 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. +`pov_sixty_nine_close_reversed_oral` as the hardest and lowest-priority route in +the atlas for now. Do not queue it as a normal prompt-only fixed-seed candidate. +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 diff --git a/docs/krea2-prompt-guide.md b/docs/krea2-prompt-guide.md index b71d383..962ee23 100644 --- a/docs/krea2-prompt-guide.md +++ b/docs/krea2-prompt-guide.md @@ -229,6 +229,24 @@ Do not over-prompt `viewer torso and thighs outside frame`; seeds `65` and that. Prefer framing them as plausible foreground body cues rather than trying to suppress them. +## Stronger-Control / Low-Priority Cases + +Some atlas routes are useful to catalog but are not good prompt-only tuning +targets yet. Keep these out of the normal fixed-seed prompt queue until easier +pose families are covered. + +### Sixty-Nine / Close Reversed POV + +`pov_sixty_nine_close_reversed_oral` is currently the hardest and low-priority +atlas route. It should be treated as a pose/control image or image-guided route +first, not a normal prompt-only fixed-seed candidate. + +The repeated atlas geometry is close and specific: the visible partner is +reversed over the viewer, hips closest to the camera, head and torso receding +away into the upper frame, and the viewer face or mouth anchoring the lower +foreground. Text-only prompting can collapse this into generic oral contact or +lose the reversed-over-viewer body arrangement. + ## Style Style should describe rendering, not camera mechanics. diff --git a/krea2_tuning_report.py b/krea2_tuning_report.py index 4186645..a1cb51a 100644 --- a/krea2_tuning_report.py +++ b/krea2_tuning_report.py @@ -53,6 +53,9 @@ def coverage_rows() -> list[dict[str, Any]]: "family": variant.get("family") or "", "action_family": variant.get("action_family") or "", "status": status, + "difficulty": variant.get("difficulty") or "", + "priority": variant.get("priority") or "", + "control_requirement": variant.get("control_requirement") or "", "coverage_state": _coverage_state(status, len(accepted)), "accepted_evidence_count": len(accepted), "total_evidence_count": len(evidence), @@ -83,6 +86,11 @@ def coverage_summary() -> dict[str, Any]: for row in rows if row.get("coverage_state") in {"needs_fixed_seed_tests", "proven_missing_evidence"} ], + "stronger_control_cases": [ + str(row.get("key")) + for row in rows + if row.get("coverage_state") == "needs_stronger_control" + ], } @@ -256,6 +264,16 @@ def markdown_report(atlas_root: str | Path | None = None) -> str: *[f"- {key}" for key in summary["next_test_candidates"]], ] ) + stronger_control_rows = [row for row in coverage_rows() if row.get("coverage_state") == "needs_stronger_control"] + if stronger_control_rows: + lines.extend(["", "## Stronger Control Cases", ""]) + for row in stronger_control_rows: + difficulty = row.get("difficulty") or "unrated" + priority = row.get("priority") or "unprioritized" + control_requirement = row.get("control_requirement") or "control_needed" + lines.append( + f"- {row['key']}: {difficulty}, {priority} priority, {control_requirement}" + ) plans = next_test_plans() if plans: lines.extend(["", "## Next Test Plans"]) diff --git a/tools/prompt_smoke.py b/tools/prompt_smoke.py index 3b5a83f..a0791e6 100644 --- a/tools/prompt_smoke.py +++ b/tools/prompt_smoke.py @@ -6874,6 +6874,12 @@ def smoke_krea2_pose_variant_catalog_policy() -> None: ) 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(sixty_nine.get("difficulty") == "hardest", "Sixty-nine route should be marked as the hardest atlas route") + _expect(sixty_nine.get("priority") == "low", "Sixty-nine route should be marked low priority") + _expect( + sixty_nine.get("control_requirement") == "pose_or_image_guidance_first", + "Sixty-nine route should require pose/image guidance before prompt-only tuning", + ) _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", @@ -6990,6 +6996,15 @@ def smoke_krea2_eval_log_policy() -> None: _expect(clean.get("observation") != "mutation should not leak", "Krea2 eval log leaked caller mutation") +def smoke_krea2_prompt_guide_policy() -> None: + guide = (ROOT / "docs" / "krea2-prompt-guide.md").read_text(encoding="utf-8") + _expect("## Stronger-Control / Low-Priority Cases" in guide, "Krea2 prompt guide lost stronger-control section") + _expect("pov_sixty_nine_close_reversed_oral" in guide, "Krea2 prompt guide lost sixty-nine unstable route") + _expect("hardest" in guide and "low-priority" in guide, "Krea2 prompt guide lost hardest low-priority wording") + _expect("not a normal prompt-only fixed-seed candidate" in guide, "Krea2 prompt guide should not queue sixty-nine as normal prompt tuning") + _expect("pose/control image" in guide or "image-guided" in guide, "Krea2 prompt guide lost control-first guidance") + + def smoke_krea2_tuning_report_policy() -> None: rows = krea2_tuning_report.coverage_rows() catalog_keys = krea2_pose_variant_catalog.variant_keys() @@ -7022,6 +7037,12 @@ def smoke_krea2_tuning_report_policy() -> None: 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") + _expect(sixty_nine.get("difficulty") == "hardest", "Sixty-nine report lost hardest-route marker") + _expect(sixty_nine.get("priority") == "low", "Sixty-nine report lost low-priority marker") + _expect( + sixty_nine.get("control_requirement") == "pose_or_image_guidance_first", + "Sixty-nine report lost control-first marker", + ) 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") @@ -7081,6 +7102,10 @@ def smoke_krea2_tuning_report_policy() -> None: ], f"Krea2 tuning report missing-evidence set changed: {summary.get('variants_without_accepted_evidence')}", ) + _expect( + summary.get("stronger_control_cases") == ["pov_sixty_nine_close_reversed_oral"], + f"Krea2 tuning report stronger-control set changed: {summary.get('stronger_control_cases')}", + ) plans = krea2_tuning_report.next_test_plans() _expect( "pov_sixty_nine_close_reversed_oral" not in [plan.get("key") for plan in plans], @@ -7304,6 +7329,10 @@ def smoke_krea2_tuning_report_policy() -> None: _expect("seed 7302" in markdown, "Krea2 tuning report markdown lost evidence seed") _expect("generator_patch" in markdown, "Krea2 tuning report markdown lost evidence decision") _expect("upright frontal boobjob geometry" in markdown, "Krea2 tuning report markdown lost evidence prompt summary") + _expect("## Stronger Control Cases" in markdown, "Krea2 tuning report markdown lost stronger-control section") + _expect("hardest" in markdown, "Krea2 tuning report markdown lost hardest-route marker") + _expect("low priority" in markdown, "Krea2 tuning report markdown lost low-priority marker") + _expect("pose_or_image_guidance_first" in markdown, "Krea2 tuning report markdown lost control-first marker") _expect("pov_ballsucking_low_head" in markdown, "Krea2 tuning report markdown lost candidate variant") _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") @@ -10333,6 +10362,7 @@ SMOKE_CASES: list[tuple[str, Callable[[], None]]] = [ ("krea2_pov_pose_variant_catalog", smoke_krea2_pov_pose_variant_catalog), ("krea2_pose_variant_catalog_policy", smoke_krea2_pose_variant_catalog_policy), ("krea2_eval_log_policy", smoke_krea2_eval_log_policy), + ("krea2_prompt_guide_policy", smoke_krea2_prompt_guide_policy), ("krea2_tuning_report_policy", smoke_krea2_tuning_report_policy), ("krea_pov_penetration_route", smoke_krea_pov_penetration_route), ("pov_outercourse_position_routes", smoke_pov_outercourse_position_routes),