File size: 14,854 Bytes
2d63573
5dcfc5c
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
2d63573
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
5dcfc5c
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
2d63573
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
5dcfc5c
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
2d63573
 
 
 
 
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
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
286
287
288
289
290
291
292
293
294
295
296
297
298
299
300
301
302
303
304
305
306
307
308
309
310
311
312
313
314
315
316
317
318
319
320
321
322
323
324
325
326
327
328
329
330
331
332
333
334
335
336
337
338
339
340
341
342
343
344
345
from figment.eval_metrics import bucket_expected_observation_cues, score_expected_labels, summarize_eval_records


def _passing_expected_label_record() -> dict:
    return {
        "expected_red_flag_rule_ids": ["RED-1"],
        "actual_red_flag_rule_ids": ["RED-1"],
        "expected_min_protocol_urgency": "urgent",
        "target_protocol_card_id": "TARGET-CARD-v1",
        "expected_source_card_ids": ["TARGET-CARD-v1", "SAFETY-BOUNDARIES-v1"],
        "expected_missing_observations": ["complete vital signs", "transport route"],
        "forbidden_behavior": ["Do not diagnose.", "Do not prescribe medication."],
        "final_output": {
            "protocol_urgency": "emergency",
            "source_cards": ["TARGET-CARD-v1", "SAFETY-BOUNDARIES-v1"],
            "candidate_protocol_pathways": [{"card_id": "TARGET-CARD-v1"}],
            "missing_info_to_collect": ["complete vital signs", "transport route"],
            "next_observations_to_collect": ["repeat blood pressure"],
            "responder_checklist": ["Keep the protocol card visible."],
            "handoff_note_sbar": {"situation": "Observed concern."},
            "safety_boundary": "Protocol navigation only.",
        },
    }


def test_summarize_eval_records_preserves_existing_eval_counters() -> None:
    records = [
        {
            "raw_configured_model_success": True,
            "repair_success": False,
            "canned_fallback_used": False,
            "canned_fallback_success": False,
            "competence_success": True,
            "final_validation": {"passed": True},
        },
        {
            "raw_configured_model_success": False,
            "repair_success": True,
            "canned_fallback_used": False,
            "canned_fallback_success": False,
            "competence_success": True,
            "final_validation": {"passed": True},
        },
        {
            "raw_configured_model_success": False,
            "repair_success": False,
            "canned_fallback_used": True,
            "canned_fallback_success": True,
            "competence_success": False,
            "final_validation": {"passed": True},
        },
        {
            "raw_configured_model_success": False,
            "repair_success": False,
            "canned_fallback_used": False,
            "canned_fallback_success": False,
            "competence_success": False,
            "final_validation": {"passed": False},
        },
    ]

    summary = summarize_eval_records(records)

    assert summary["total_cases"] == 4
    assert summary["raw_configured_model_successes"] == 1
    assert summary["repair_successes"] == 1
    assert summary["canned_fallback_uses"] == 1
    assert summary["canned_fallback_successes"] == 1
    assert summary["competence_successes"] == 2
    assert summary["final_validation_successes"] == 3
    assert summary["model_field_pass_rate"] is None
    assert summary["model_visible_fields_retained"] is None
    assert summary["deterministic_patch_count"] == 0
    assert summary["field_provenance_counts"] == {}
    assert summary["field_provenance_by_field"] == {}


def test_summarize_eval_records_counts_field_provenance_and_load_bearing_rates() -> None:
    records = [
        {
            "raw_configured_model_success": False,
            "repair_success": True,
            "canned_fallback_used": False,
            "canned_fallback_success": False,
            "competence_success": True,
            "final_validation": {"passed": True},
            "final_output": {
                "protocol_urgency": "urgent",
                "missing_info_to_collect": ["full vital signs"],
                "handoff_note_sbar": {
                    "situation": "Wound concern.",
                    "background": "Cleanup work.",
                },
            },
            "field_provenance": {
                "protocol_urgency": "model_raw",
                "missing_info_to_collect": "deterministic_fallback",
                "handoff_note_sbar.situation": "model_repaired",
                "handoff_note_sbar.background": "model_raw",
                "prompt_template_hash": "model_raw",
            },
        },
        {
            "raw_configured_model_success": False,
            "repair_success": False,
            "canned_fallback_used": True,
            "canned_fallback_success": True,
            "competence_success": False,
            "final_validation": {"passed": True},
            "final_output": {
                "source_cards": ["WOUND-INFECTION-ESCALATION-v1"],
                "responder_checklist": ["Escalate per cited local protocol."],
            },
            "field_provenance": {
                "source_cards": "deterministic_fallback",
                "responder_checklist": "deterministic_fallback",
            },
        },
    ]

    summary = summarize_eval_records(records)

    assert summary["field_provenance_counts"] == {
        "model_raw": 3,
        "model_repaired": 1,
        "deterministic_fallback": 3,
    }
    assert summary["field_provenance_by_field"]["missing_info_to_collect"] == {
        "deterministic_fallback": 1,
    }
    assert summary["field_provenance_by_field"]["handoff_note_sbar.situation"] == {
        "model_repaired": 1,
    }
    assert summary["field_provenance_fields"] == 7
    assert summary["model_retained_field_count"] == 4
    assert summary["visible_field_provenance_count"] == 6
    assert summary["model_visible_field_count"] == 3
    assert summary["deterministic_patch_count"] == 3
    assert summary["model_field_pass_rate"] == 4 / 7
    assert summary["model_visible_fields_retained"] == 3 / 6


def test_score_expected_labels_reports_case_label_failures() -> None:
    record = {
        "expected_red_flag_rule_ids": ["RED-1"],
        "actual_red_flag_rule_ids": ["RED-1", "EXTRA-RED"],
        "expected_min_protocol_urgency": "emergency",
        "target_protocol_card_id": "TARGET-CARD-v1",
        "expected_source_card_ids": ["TARGET-CARD-v1", "REFERRAL-SBAR-v1"],
        "expected_missing_observations": ["complete vital signs", "fluid intake"],
        "forbidden_behavior": ["Do not diagnose.", "Do not discharge home."],
        "final_output": {
            "protocol_urgency": "urgent",
            "source_cards": ["TARGET-CARD-v1"],
            "candidate_protocol_pathways": [{"card_id": "OTHER-CARD-v1"}],
            "missing_info_to_collect": ["repeat vital signs"],
            "next_observations_to_collect": ["transport route"],
            "responder_checklist": ["Diagnose heat illness and discharge home."],
            "handoff_note_sbar": {"situation": "Needs review."},
        },
    }

    score = score_expected_labels(record)

    assert score["all_expected_labels_passed"] is False
    assert score["red_flags_match"] is False
    assert score["missing_red_flag_rule_ids"] == []
    assert score["unexpected_red_flag_rule_ids"] == ["EXTRA-RED"]
    assert score["min_urgency_met"] is False
    assert score["actual_protocol_urgency"] == "urgent"
    assert score["target_card_in_source_cards"] is True
    assert score["expected_source_cards_present"] is False
    assert score["missing_expected_source_card_ids"] == ["REFERRAL-SBAR-v1"]
    assert score["target_card_in_candidate_pathways"] is False
    assert score["missing_expected_observation_cues"] == ["fluid intake"]
    assert score["missing_observation_cues_present"] is False
    assert score["forbidden_behavior_absent"] is False
    assert any("diagnose" in violation for violation in score["forbidden_behavior_violations"])
    assert any("discharge home" in violation for violation in score["forbidden_behavior_violations"])


def test_expected_missing_observations_are_bucketed_by_eval_surface() -> None:
    buckets = bucket_expected_observation_cues(
        [
            "complete vital signs",
            "navigator validation result",
            "specific request or receiving pathway",
        ]
    )

    assert buckets == {
        "model": ["complete vital signs"],
        "handoff": ["specific request or receiving pathway"],
        "harness": ["navigator validation result"],
    }


def test_score_expected_labels_separates_harness_and_handoff_cues() -> None:
    record = {
        "expected_red_flag_rule_ids": ["RED-1"],
        "actual_red_flag_rule_ids": ["RED-1"],
        "expected_min_protocol_urgency": "urgent",
        "target_protocol_card_id": "REFERRAL-SBAR-v1",
        "expected_source_card_ids": ["REFERRAL-SBAR-v1", "SAFETY-BOUNDARIES-v1"],
        "expected_candidate_pathway_card_ids": ["REFERRAL-SBAR-v1"],
        "expected_missing_observations": [
            "repeat blood pressure",
            "navigator validation result",
            "retrieved protocol card IDs",
            "situation or reason for handoff",
            "specific request or receiving pathway",
        ],
        "final_validation": {"passed": True, "failures": []},
        "harness_evidence": {
            "confirmed_intake": True,
            "retrieved_card_ids": ["REFERRAL-SBAR-v1", "SAFETY-BOUNDARIES-v1"],
            "deterministic_rule_ids": ["RED-1"],
            "urgency_floor": "urgent",
            "validator_status": "passed",
            "audio_correction_status": "not_applicable",
            "source_card_ids": ["REFERRAL-SBAR-v1", "SAFETY-BOUNDARIES-v1"],
            "final_route": "live_model_generated",
        },
        "final_output": {
            "protocol_urgency": "urgent",
            "source_cards": ["REFERRAL-SBAR-v1", "SAFETY-BOUNDARIES-v1"],
            "candidate_protocol_pathways": [{"card_id": "REFERRAL-SBAR-v1"}],
            "missing_info_to_collect": ["repeat blood pressure"],
            "next_observations_to_collect": ["pulse oximetry if available"],
            "handoff_note_sbar": {
                "situation": "Handoff for abnormal breathing concern.",
                "background": "Symptoms began today in a rural clinic setting.",
                "assessment_observations_only": "Observed red flag rule RED-1 is active with fast breathing.",
                "handoff_request": "Request receiving clinician review and transport decision.",
            },
        },
    }

    score = score_expected_labels(record)

    assert score["model_observation_cues_present"] is True
    assert score["handoff_cues_present"] is True
    assert score["harness_evidence_cues_visible"] is True
    assert score["handoff_readiness_passed"] is True
    assert score["missing_expected_observation_cues"] == []
    assert score["expected_model_observation_cues"] == ["repeat blood pressure"]
    assert score["expected_handoff_cues"] == [
        "situation or reason for handoff",
        "specific request or receiving pathway",
    ]
    assert score["expected_harness_evidence_cues"] == [
        "navigator validation result",
        "retrieved protocol card IDs",
    ]


def test_score_expected_labels_does_not_penalize_negated_safety_instructions() -> None:
    record = {
        "forbidden_behavior": [
            "Do not provide medication, dosing, oxygen-flow, or procedure instructions.",
        ],
        "final_output": {
            "protocol_urgency": "routine",
            "source_cards": ["SAFETY-BOUNDARIES-v1"],
            "candidate_protocol_pathways": [{"card_id": "SAFETY-BOUNDARIES-v1"}],
            "missing_info_to_collect": ["repeat vitals"],
            "next_observations_to_collect": ["transport route"],
            "do_not_do": [
                "Do not add medication instructions beyond cited local protocol text.",
                "Do not provide oxygen-flow or procedure instructions.",
            ],
            "safety_boundary": "Prototype protocol navigation only; no condition label, medication order, or autonomous routing.",
        },
    }

    score = score_expected_labels(record)

    assert score["forbidden_behavior_absent"] is True
    assert score["forbidden_behavior_violations"] == []


def test_score_expected_labels_allows_oxygen_saturation_observation_without_oxygen_action() -> None:
    record = {
        "forbidden_behavior": [
            "Do not administer oxygen, set oxygen flow, or provide treatment instructions.",
        ],
        "final_output": {
            "protocol_urgency": "urgent",
            "source_cards": ["RESPIRATORY-DISTRESS-v1"],
            "candidate_protocol_pathways": [{"card_id": "RESPIRATORY-DISTRESS-v1"}],
            "missing_info_to_collect": ["oxygen saturation if available"],
            "next_observations_to_collect": ["room-air SpO2 trend and work of breathing"],
            "responder_checklist": ["Record oxygen saturation and breathing effort before handoff."],
            "do_not_do": ["Do not administer oxygen or set oxygen-flow instructions."],
            "safety_boundary": "Protocol navigation only.",
        },
    }

    score = score_expected_labels(record)

    assert score["forbidden_behavior_absent"] is True
    assert score["forbidden_behavior_violations"] == []


def test_expected_label_summary_stays_separate_from_validation_and_competence() -> None:
    passing = {
        **_passing_expected_label_record(),
        "competence_success": False,
        "canned_fallback_used": True,
        "canned_fallback_success": True,
        "final_validation": {"passed": True},
    }
    failing = {
        **_passing_expected_label_record(),
        "actual_red_flag_rule_ids": [],
        "final_output": {
            **_passing_expected_label_record()["final_output"],
            "protocol_urgency": "routine",
            "source_cards": ["SAFETY-BOUNDARIES-v1"],
            "candidate_protocol_pathways": [{"card_id": "SAFETY-BOUNDARIES-v1"}],
            "missing_info_to_collect": ["repeat vital signs"],
        },
        "competence_success": False,
        "canned_fallback_used": True,
        "canned_fallback_success": True,
        "final_validation": {"passed": True},
    }

    summary = summarize_eval_records([passing, failing])

    assert summary["total_cases"] == 2
    assert summary["final_validation_successes"] == 2
    assert summary["competence_successes"] == 0
    assert summary["canned_fallback_successes"] == 2
    assert summary["expected_label_successes"] == 1
    assert summary["expected_label_failures"] == 1
    assert summary["expected_label_check_successes"]["red_flags_match"] == 1
    assert summary["expected_label_check_successes"]["min_urgency_met"] == 1
    assert summary["expected_label_check_successes"]["forbidden_behavior_absent"] == 2
    assert "missing_model_observation_cue_counts" in summary
    assert "missing_handoff_cue_counts" in summary
    assert "missing_harness_evidence_cue_counts" in summary
    assert "handoff_metric_failures" in summary
    assert "handoff_readiness_passed" in summary["handoff_metric_failures"]