Split manual hardcore action routing

This commit is contained in:
2026-06-27 19:06:32 +02:00
parent c6f0fc34af
commit 08627be954
7 changed files with 24 additions and 14 deletions
+12 -8
View File
@@ -4906,7 +4906,7 @@ def smoke_hardcore_position_config_policy() -> None:
"Template action-family normalizer should accept spaced aliases",
)
_expect(
category_template_metadata.template_action_family({"action_family": "manual stimulation"}) == "foreplay",
category_template_metadata.template_action_family({"action_family": "manual stimulation"}) == "manual",
"Template action-family normalizer should accept subcategory-style aliases",
)
_expect(
@@ -5115,7 +5115,7 @@ def smoke_hardcore_position_config_policy() -> None:
{
"name": "Inherited metadata route",
"item_template_metadata": {
"action_family": "foreplay",
"action_family": "manual",
"position_family": "manual",
"position_keys": ["kneeling"],
"formatter_hint": {"caption": "inherited caption cue"},
@@ -5132,7 +5132,7 @@ def smoke_hardcore_position_config_policy() -> None:
)
_expect(inherited_text == "hand stimulation in kneeling manual position", "Inherited template metadata changed item text")
_expect(inherited_axis_values == {"act": "hand stimulation", "position": "kneeling manual position"}, "Inherited template metadata lost axis values")
_expect(inherited_metadata.get("action_family") == "foreplay", "String template did not inherit action family")
_expect(inherited_metadata.get("action_family") == "manual", "String template did not inherit action family")
_expect(inherited_metadata.get("position_family") == "manual", "String template did not inherit position family")
_expect(pb._template_position_keys(inherited_metadata) == ["kneeling"], "String template did not inherit position keys")
_expect(
@@ -5145,7 +5145,7 @@ def smoke_hardcore_position_config_policy() -> None:
{
"name": "Override metadata route",
"item_template_metadata": {
"action_family": "foreplay",
"action_family": "manual",
"position_family": "manual",
"formatter_hint": {"all": "inherited shared cue"},
},
@@ -5343,7 +5343,7 @@ def smoke_row_route_metadata_policy() -> None:
item_axis_values={"position": "kneeling manual position"},
)
_expect(fallback["position_family"] == "manual", "Route policy lost source position-family fallback")
_expect(fallback["action_family"] == "foreplay", "Route policy lost source action-family fallback")
_expect(fallback["action_family"] == "manual", "Route policy lost source action-family fallback")
_expect("kneeling" in fallback["position_keys"], "Route policy lost inferred position key")
empty = row_route_metadata.resolve_action_position_route(
@@ -5519,7 +5519,7 @@ def smoke_hardcore_category_routes() -> None:
cases = [
("hardcore_penetration", "Penetrative sex", "penetration_only", "penetrative", {"penetration", "default"}, "penetrative sex", "penetrative action"),
("hardcore_oral", "Oral sex", "oral_only", "oral", {"oral"}, "oral sex", "oral action"),
("hardcore_manual", "Manual stimulation", "manual_only", "manual", {"foreplay", "outercourse"}, "manual stimulation", "manual action"),
("hardcore_manual", "Manual stimulation", "manual_only", "manual", {"manual"}, "manual stimulation", "manual action"),
("hardcore_outercourse", "Outercourse and genital teasing", "outercourse_only", "outercourse", {"outercourse"}, "outercourse", "non-penetrative action"),
("hardcore_foreplay", "Foreplay and teasing", "foreplay_only", "foreplay", {"foreplay"}, "foreplay", "foreplay action"),
("hardcore_aftercare", "Aftercare and cleanup", "interaction_only", "interaction", {"foreplay"}, "interaction", "interaction beat"),
@@ -6938,7 +6938,11 @@ def smoke_interaction_role_graph_routes() -> None:
hardcore_position_config=_position_filter(focus, family, [position_key]),
)
_expect_custom_row(row, name)
_expect(row.get("action_family") == "foreplay", f"{name} action_family should stay formatter foreplay")
expected_action_family = "manual" if family == "manual" else "foreplay"
_expect(
row.get("action_family") == expected_action_family,
f"{name} action_family mismatch: {row.get('action_family')} != {expected_action_family}",
)
_expect(row.get("position_family") == family, f"{name} position_family mismatch: {row.get('position_family')}")
_expect(position_key in (row.get("position_keys") or []), f"{name} lost position key {position_key!r}")
role_graph = _expect_text(f"{name}.source_role_graph", row.get("source_role_graph"), 40).lower()
@@ -7131,7 +7135,7 @@ def smoke_formatter_metadata_fixtures() -> None:
"Woman A reclines with thighs open while Man A's hand is between her legs, "
"fingers visibly stimulating her pussy."
),
action_family="foreplay",
action_family="manual",
position_family="manual",
position_key="fingering",
position_keys=["fingering", "open_thighs"],