Audit location theme camera profiles

This commit is contained in:
2026-06-27 17:50:06 +02:00
parent 2b9e880b11
commit 8a1a34ad08
2 changed files with 81 additions and 0 deletions
+78
View File
@@ -25,7 +25,9 @@ import category_template_metadata as template_metadata_policy # noqa: E402
import category_library as category_policy # noqa: E402
import caption_naturalizer # noqa: E402
import krea_formatter # noqa: E402
import location_config as location_policy # noqa: E402
import prompt_builder as pb # noqa: E402
import scene_camera_adapters as scene_camera_policy # noqa: E402
import sdxl_formatter # noqa: E402
POOL_DEFINITION_KEYS = ("scene_pools", "expression_pools", "composition_pools")
@@ -513,6 +515,75 @@ def _effective_category_coverage_errors(paths: list[Path]) -> list[tuple[str, st
return errors
def _location_theme_camera_profile_errors() -> list[tuple[str, str, str]]:
errors: list[tuple[str, str, str]] = []
profile_keys = set(scene_camera_policy.SCENE_CAMERA_PROFILE_KEYS)
theme_profile_keys = scene_camera_policy.THEME_PROFILE_KEYS
for theme_name, theme_data in location_policy.THEMATIC_LOCATION_PRESETS.items():
theme_path = f"THEMATIC_LOCATION_PRESETS.{theme_name}"
mapped_profile_key = theme_profile_keys.get(theme_name)
if mapped_profile_key and mapped_profile_key not in profile_keys:
errors.append(
(
"scene_camera_adapters.py",
f"THEME_PROFILE_KEYS.{theme_name}",
f"unknown scene camera profile key: {mapped_profile_key}",
)
)
locations = theme_data.get("locations") if isinstance(theme_data, dict) else None
if not isinstance(locations, list) or not locations:
errors.append(("location_config.py", f"{theme_path}.locations", "theme must define non-empty locations"))
continue
for index, entry in enumerate(locations):
entry_path = f"{theme_path}.locations[{index}]"
if not isinstance(entry, dict):
errors.append(("location_config.py", entry_path, "location entry must be an object"))
continue
slug = str(entry.get("slug") or "").strip()
prompt = str(entry.get("prompt") or "").strip()
if not slug:
errors.append(("location_config.py", f"{entry_path}.slug", "missing slug"))
if not prompt:
errors.append(("location_config.py", f"{entry_path}.prompt", "missing prompt"))
continue
themed_entry = dict(entry)
themed_entry.setdefault("theme", theme_name)
profile = scene_camera_policy.scene_camera_profile(
prompt,
scene_entry=themed_entry,
theme=theme_name,
)
if not profile:
errors.append(
(
"scene_camera_adapters.py",
entry_path,
"themed location does not resolve to a scene camera profile",
)
)
continue
key = str(profile.get("key") or "").strip()
if key not in profile_keys:
errors.append(
(
"scene_camera_adapters.py",
entry_path,
f"resolved unknown scene camera profile key: {key or '(empty)'}",
)
)
if mapped_profile_key and key != mapped_profile_key:
errors.append(
(
"scene_camera_adapters.py",
entry_path,
f"theme resolved to {key}, expected {mapped_profile_key}",
)
)
return errors
def _smoke_case_names(path: Path) -> set[str]:
if not path.exists():
return set()
@@ -883,6 +954,13 @@ def main() -> int:
return 1
print("OK: category routes define effective item, scene, expression, composition, and route metadata coverage.")
print("\n# Location Theme Camera Profile Validation")
location_profile_errors = _location_theme_camera_profile_errors()
if location_profile_errors:
print_table(("Source", "Path", "Issue"), location_profile_errors)
return 1
print("OK: location themes and themed scene entries resolve to scene camera profiles.")
print("\n# Routing Documentation Validation")
routing_doc_errors = _routing_doc_errors()
if routing_doc_errors: