""" Registry: Profil-Stammdaten und statische Zeitraum-Labels für Prompts. """ from placeholder_registry import ( PlaceholderMetadata, MissingValuePolicy, OutputType, PlaceholderType, register_placeholder, ) from ._evidence import tag_standard_evidence MVP = lambda reason, disp: MissingValuePolicy( available=False, value_raw=None, missing_reason=reason, legacy_display=disp ) def register_profil_zeitraum(): cat_profil = "Profil" for key, desc, res_fn, unit, ptype, out, hint, ex, sem in [ ( "name", "Anzeigename aus profiles.name", "get_profile_name", "text", PlaceholderType.ATOMIC, OutputType.STRING, "Kurzname", "Max", "profiles.name, Fallback „Nutzer“.", ), ( "age", "Alter in Jahren aus profiles.dob", "get_profile_age_display", "Jahre", PlaceholderType.ATOMIC, OutputType.STRING, "Ganzzahl oder unbekannt", "42", "Berechnung aus Geburtsdatum; PostgreSQL date oder ISO-String.", ), ( "height", "Körpergröße (cm) aus profiles.height", "get_profile_height_display", "cm", PlaceholderType.ATOMIC, OutputType.STRING, "Zahl oder unbekannt", "180", "profiles.height.", ), ( "geschlecht", "Geschlecht (männlich/weiblich) aus profiles.sex", "get_profile_geschlecht_display", "Kategorie", PlaceholderType.ATOMIC, OutputType.STRING, "m/w-Mapping", "männlich", "sex == 'm' → männlich, sonst weiblich.", ), ]: m = PlaceholderMetadata( key=key, category=cat_profil, description=desc, resolver_module="backend/placeholder_resolver.py", resolver_function=res_fn, data_layer_module=None, data_layer_function=None, source_tables=["profiles"], semantic_contract=sem, business_meaning="Profil-Kontext für KI-Prompts", unit=unit, time_window="latest profile row", output_type=out, placeholder_type=ptype, format_hint=hint, example_output=ex, minimum_data_requirements="Profilzeile", quality_filter_policy=None, confidence_logic="Row vorhanden", missing_value_policy=MVP("no_data", "unbekannt" if key != "name" else "Nutzer"), known_limitations="Keine diversen Geschlechtsoptionen im Platzhalter", layer_1_decision="profiles", layer_2a_decision=res_fn, layer_2b_reuse_possible=False, architecture_alignment="Phase 0b", issue_53_alignment="Resolver", evidence={}, ) tag_standard_evidence(m) register_placeholder(m) cat_zeit = "Zeitraum" for key, desc, res_fn, sem, ex_out in [ ("datum_heute", "Heutiges Datum (lokal)", "get_datum_heute", "datetime.now, Format dd.mm.yyyy", "11.04.2026"), ("zeitraum_7d", "Label „letzte 7 Tage“", "get_zeitraum_label_7d", "Statisches UI/Prompt-Label", "letzte 7 Tage"), ("zeitraum_30d", "Label „letzte 30 Tage“", "get_zeitraum_label_30d", "Statisches UI/Prompt-Label", "letzte 30 Tage"), ("zeitraum_90d", "Label „letzte 90 Tage“", "get_zeitraum_label_90d", "Statisches UI/Prompt-Label", "letzte 90 Tage"), ]: m = PlaceholderMetadata( key=key, category=cat_zeit, description=desc, resolver_module="backend/placeholder_resolver.py", resolver_function=res_fn, data_layer_module=None, data_layer_function=None, source_tables=[], semantic_contract=sem, business_meaning="Zeitlicher Bezug im Prompt ohne Datenabfrage", unit="label", time_window="n/a", output_type=OutputType.STRING, placeholder_type=PlaceholderType.META, format_hint="Kurzdeutsch", example_output=ex_out, minimum_data_requirements=None, quality_filter_policy=None, confidence_logic="Immer verfügbar", missing_value_policy=None, known_limitations="Kein kalender-basierter Datenfilter allein durch Platzhalter", layer_1_decision="n/a", layer_2a_decision=res_fn, layer_2b_reuse_possible=False, architecture_alignment="Phase 0b", issue_53_alignment="Resolver", evidence={}, ) tag_standard_evidence(m) register_placeholder(m) register_profil_zeitraum()