"""Turn analyze_relationship event_class_split into theme-evidence items. Punarphoo / romantic_activation stay observation-only. Legal-marriage items are emitted only when MD/AD hits exist; PD hits never promote that class. """ from __future__ import annotations from typing import Any, Callable CLAIM_BOUNDARY = ( "romantic_activation is observation-only and is not legal marriage. " "PD hits do not promote an event class. Dasha dates must come from the engine." ) ThemeEvidence = Callable[..., dict] def _as_dict(value: Any) -> dict: return value if isinstance(value, dict) else {} def _hits(block: dict) -> list: hits = block.get("hits") return [item for item in hits] if isinstance(hits, list) else [] def _natal(block: dict) -> list: natal = block.get("natal_structure") return [item for item in natal] if isinstance(natal, list) else [] def build_event_class_evidence(relationship: dict, theme_evidence: ThemeEvidence) -> list[dict]: relationship = relationship if isinstance(relationship, dict) else {} split = _as_dict(relationship.get("event_class_split")) if not split: return [] pd_hits = split.get("pd_hits") if isinstance(split.get("pd_hits"), list) else [] items: list[dict] = [] romantic = _as_dict(split.get("romantic_activation")) if _hits(romantic) or _natal(romantic): items.append( theme_evidence( "Romantic-activation", "Dasha", "心动层(观察):5L / 7宫月亮 / Punarphoo 只说明感情是否被激活,不能写成领证。", "neutral", "weak", source="relationship.event_class_split", details={ "event_class": "romantic_activation", "hits": _hits(romantic), "pd_hits": pd_hits, "natal_structure": _natal(romantic), "claim_boundary": CLAIM_BOUNDARY, }, ) ) formation = _as_dict(split.get("relationship_formation")) if _hits(formation): items.append( theme_evidence( "Relationship-formation", "Dasha", "成对层:7L / DK / UL 结构进入观察,仍不是法律婚。", "neutral", "moderate", source="relationship.event_class_split", details={ "event_class": "relationship_formation", "hits": _hits(formation), "pd_hits": pd_hits, "claim_boundary": CLAIM_BOUNDARY, }, ) ) legal = _as_dict(split.get("legal_marriage")) legal_hits = _hits(legal) if legal_hits: items.append( theme_evidence( "Legal-marriage", "Dasha", "法律婚层:仅 MD/AD 命中 Venus / DK / UL 时列出,PD 命中不升格。", "neutral", "moderate", source="relationship.event_class_split", details={ "event_class": "legal_marriage", "hits": legal_hits, "pd_hits": pd_hits, "natal_structure": _natal(legal), "claim_boundary": CLAIM_BOUNDARY, }, ) ) return items