File size: 5,338 Bytes
aad7814
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
"""Interference-level prompt routing in reference_mapper."""

from __future__ import annotations

from backend.core.reference_mapper import (
    build_interference_messages,
    map_reference_paragraph,
    select_mapping_prompt,
)
from backend.prompts.mapping_prompt import (
    MAPPING_SYSTEM_BASE_MAXIMUM,
    MAPPING_SYSTEM_BASE_MEDIUM,
    MAPPING_SYSTEM_BASE_MINIMUM,
)
from backend.models.schema import TemplateSchema
from backend.prompts.maximum_compose_prompt import MAXIMUM_SYSTEM, build_maximum_messages
from backend.prompts.medium_expand_prompt import MEDIUM_SYSTEM, build_medium_messages
from backend.prompts.minimum_weave_prompt import MINIMUM_SYSTEM, build_minimum_messages


def test_select_mapping_prompt_routes_tier_bases():
    assert select_mapping_prompt("minimum") is MAPPING_SYSTEM_BASE_MINIMUM
    assert select_mapping_prompt("medium") is MAPPING_SYSTEM_BASE_MEDIUM
    assert select_mapping_prompt("maximum") is MAPPING_SYSTEM_BASE_MAXIMUM
    assert select_mapping_prompt("bogus") is MAPPING_SYSTEM_BASE_MAXIMUM
    assert select_mapping_prompt(None) is MAPPING_SYSTEM_BASE_MAXIMUM  # type: ignore[arg-type]


def test_build_minimum_messages_signature_and_strategy():
    msgs = build_minimum_messages("slate slipped", "The roof comprises slate tiles.")
    assert msgs[0]["role"] == "system"
    assert msgs[1]["role"] == "user"
    assert "zero-inference data mapping engine" in msgs[0]["content"]
    assert "DO NOT ADD NEW SENTENCES" in msgs[0]["content"]
    assert "SECTION:" in msgs[1]["content"]
    assert "INPUT 1: PAST-REPORT SCAFFOLD" in msgs[1]["content"]
    assert "INPUT 2: CURRENT INSPECTION NOTES" in msgs[1]["content"]
    assert "* slate slipped" in msgs[1]["content"]


def test_build_medium_messages_signature_and_strategy():
    msgs = build_medium_messages("det to DPC, rep reqd", "The walls were inspected.")
    assert "professional technical copyeditor" in msgs[0]["content"]
    assert "ABSOLUTE HISTORICAL GROUNDING" in msgs[0]["content"]
    assert "PROOFREAD & ENHANCE TECHNICAL DEPTH" in msgs[0]["content"]
    assert "INPUT 2: CURRENT INSPECTION NOTES" in msgs[1]["content"]
    assert "* det to DPC, rep reqd" in msgs[1]["content"]


def test_build_maximum_messages_signature_and_strategy():
    msgs = build_maximum_messages("asbestos noted", "The ceiling was inspected.")
    assert "expert UK Chartered Building Surveyor" in msgs[0]["content"]
    assert "UK_PROPERTY_SURVEYING_DOMAIN_KNOWLEDGE" in msgs[0]["content"]
    assert "INTEGRATED NARRATIVE DRAFTING" in msgs[0]["content"]
    assert "INPUT 2: CURRENT INSPECTION NOTES" in msgs[1]["content"]
    assert "* asbestos noted" in msgs[1]["content"]


def test_all_tiers_share_rics_domain_rules():
    for system in (MINIMUM_SYSTEM, MEDIUM_SYSTEM, MAXIMUM_SYSTEM):
        assert '"1", "2", "3", "NI", "NA"' in system
        assert "[AMBIGUOUS:" in system


def test_build_interference_messages_routes_by_level():
    baseline = "The roof comprises slate tiles."
    notes = ["slate slipped"]
    schema = TemplateSchema()

    min_msgs = build_interference_messages(
        "minimum", observations=notes, baseline=baseline, schema=schema
    )
    med_msgs = build_interference_messages(
        "medium", observations=notes, baseline=baseline, schema=schema
    )
    max_msgs = build_interference_messages(
        "maximum", observations=notes, baseline=baseline, schema=schema
    )

    assert "UPLOADED USER PAST REPORTS" in min_msgs[0]["content"]
    assert MAPPING_SYSTEM_BASE_MINIMUM.strip() in min_msgs[0]["content"]
    assert "ABSOLUTE HISTORICAL GROUNDING" in med_msgs[0]["content"]
    assert MAPPING_SYSTEM_BASE_MEDIUM.strip() in med_msgs[0]["content"]
    assert "INTEGRATED NARRATIVE DRAFTING" in max_msgs[0]["content"]
    assert MAPPING_SYSTEM_BASE_MAXIMUM.strip() in max_msgs[0]["content"]
    assert min_msgs[0]["content"] != med_msgs[0]["content"] != max_msgs[0]["content"]


def test_build_interference_messages_unknown_defaults_to_maximum():
    explicit = build_interference_messages(
        "maximum",
        observations=["x"],
        baseline="baseline prose.",
        schema=TemplateSchema(),
    )
    unknown = build_interference_messages(
        "bogus",
        observations=["x"],
        baseline="baseline prose.",
        schema=TemplateSchema(),
    )
    assert unknown[0]["content"] == explicit[0]["content"]
    assert unknown[1]["content"] == explicit[1]["content"]


def test_map_reference_paragraph_branches_on_level(monkeypatch):
    captured: list[str] = []

    def fake_build(level, **kwargs):
        captured.append(str(level))
        return [{"role": "system", "content": "sys"}, {"role": "user", "content": "user"}]

    monkeypatch.setattr(
        "backend.core.reference_mapper.build_interference_messages",
        fake_build,
    )
    monkeypatch.setattr(
        "backend.core.reference_mapper.map_inplace_baseline",
        lambda *args, **kwargs: kwargs.get("messages") and "ok" or "fail",
    )

    schema = TemplateSchema()
    baseline = "The chimney was inspected."
    notes = ["crack noted"]

    map_reference_paragraph(baseline, notes, schema, "minimum")
    map_reference_paragraph(baseline, notes, schema, "medium")
    map_reference_paragraph(baseline, notes, schema, "maximum")

    assert captured == ["minimum", "medium", "maximum"]