"""Read port for an EPC-less Property's prediction attributes (ADR-0031 slice-5d). Returns the `property_type` / `built_form` / `wall_construction` resolved from Landlord Overrides that `build_prediction_target` needs. Kept a port because the real adapter — a read over the `property_overrides` fact layer — is being built separately (see docs/HANDOVER_EPC_PREDICTION_WIRING.md); the ingestion wiring depends on this abstraction and tests substitute a fake. """ from __future__ import annotations from abc import ABC, abstractmethod from domain.epc_prediction.prediction_target import PredictionTargetAttributes class PredictionTargetAttributesReader(ABC): @abstractmethod def attributes_for(self, property_id: int) -> PredictionTargetAttributes: """The Property's resolved prediction attributes. `property_type` is None when it could not be resolved — which gates the Property out of prediction (`build_prediction_target` returns None).""" ...