Compose the party-ceiling and sloping-ceiling roof guards ahead of the LLM 🟥

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
This commit is contained in:
Khalim Conn-Kowlessar 2026-07-23 13:50:13 +00:00
parent a6a2764b5e
commit 82ac8c341b
2 changed files with 46 additions and 0 deletions

View file

@ -0,0 +1,9 @@
from __future__ import annotations
from typing import Optional
from domain.epc.property_overrides.roof_type import RoofType
def roof_guard(description: str) -> Optional[RoofType]:
raise NotImplementedError

View file

@ -0,0 +1,37 @@
"""The composed roof guard wired into the roof `GuardedColumnClassifier`.
Two deterministic roof guards compose ahead of the LLM fallback: the
party-ceiling guard (#1376) and the sloping-ceiling guard (ADR-0066). A roof
description that neither recognises returns None and reaches the LLM.
"""
from __future__ import annotations
from domain.epc.property_overrides.roof_guard import roof_guard
from domain.epc.property_overrides.roof_type import RoofType
def test_party_ceiling_marker_resolves_to_its_party_member() -> None:
# Act
member = roof_guard("another dwelling above")
# Assert
assert member is RoofType.ADJACENT_ANOTHER_DWELLING_ABOVE
def test_sloping_ceiling_marker_resolves_to_the_sloping_family() -> None:
# Act
member = roof_guard("PitchedWithSlopingCeiling: 150mm")
# Assert
assert member is RoofType.PITCHED_SLOPING_CEILING_150MM
def test_a_plain_loft_description_is_left_for_the_llm() -> None:
# Neither deterministic guard recognises a loft depth, so it reaches the LLM.
# Act
member = roof_guard("Pitched, 150 mm loft insulation")
# Assert
assert member is None