Repair hallucinated Semantic Consolidator source IDs
This commit is contained in:
@@ -415,6 +415,136 @@ class ConsolidateFactsTests(unittest.TestCase):
|
||||
["remove_duplicate_source_id", "remove_empty_group"],
|
||||
)
|
||||
|
||||
def test_source_coverage_repair_keeps_valid_ids_unchanged(self):
|
||||
facts = fact_items(canonicalized_fixture())
|
||||
model_output = {
|
||||
"groups": [self.group("Merged", ["fact_0001", "fact_0002"], "Same.")]
|
||||
}
|
||||
|
||||
repaired, changes = repair_model_group_coverage(model_output, facts)
|
||||
|
||||
self.assertEqual(repaired, model_output)
|
||||
self.assertEqual(changes, [])
|
||||
validate_model_groups(repaired, {"fact_0001", "fact_0002"})
|
||||
|
||||
def test_source_coverage_repair_removes_unknown_id_but_keeps_valid_id(self):
|
||||
facts = fact_items(canonicalized_fixture())
|
||||
repaired, changes = repair_model_group_coverage(
|
||||
{
|
||||
"groups": [
|
||||
self.group("Supported", ["fact_0001", "fact_9999"], "Partial.")
|
||||
]
|
||||
},
|
||||
facts,
|
||||
)
|
||||
|
||||
self.assertEqual(repaired["groups"][0]["source_item_ids"], ["fact_0001"])
|
||||
self.assertEqual(changes[0]["operation"], "remove_unknown_source_id")
|
||||
self.assertEqual(changes[0]["id"], "fact_9999")
|
||||
|
||||
def test_source_coverage_repair_removes_multiple_unknown_ids(self):
|
||||
facts = fact_items(canonicalized_fixture())
|
||||
repaired, changes = repair_model_group_coverage(
|
||||
{
|
||||
"groups": [
|
||||
self.group(
|
||||
"Supported",
|
||||
["unknown_a", "fact_0001", "unknown_b", "fact_0002"],
|
||||
"Partial.",
|
||||
)
|
||||
]
|
||||
},
|
||||
facts,
|
||||
)
|
||||
|
||||
self.assertEqual(
|
||||
repaired["groups"][0]["source_item_ids"],
|
||||
["fact_0001", "fact_0002"],
|
||||
)
|
||||
self.assertEqual(
|
||||
[change["id"] for change in changes],
|
||||
["unknown_a", "unknown_b"],
|
||||
)
|
||||
|
||||
def test_source_coverage_repair_drops_group_with_only_unknown_ids(self):
|
||||
facts = fact_items(canonicalized_fixture())
|
||||
repaired, changes = repair_model_group_coverage(
|
||||
{"groups": [self.group("Unsupported", ["unknown_a"], "Unsupported.")]},
|
||||
facts,
|
||||
)
|
||||
|
||||
self.assertNotIn("Unsupported", [group["canonical_text"] for group in repaired["groups"]])
|
||||
self.assertEqual(
|
||||
[change["operation"] for change in changes[:2]],
|
||||
["remove_unknown_source_id", "remove_empty_group"],
|
||||
)
|
||||
validate_model_groups(repaired, {"fact_0001", "fact_0002"})
|
||||
|
||||
def test_unknown_id_removal_that_empties_group_is_recorded(self):
|
||||
facts = fact_items(canonicalized_fixture())
|
||||
_repaired, changes = repair_model_group_coverage(
|
||||
{
|
||||
"groups": [
|
||||
self.group("Unsupported", ["unknown_a", "unknown_b"], "Unsupported.")
|
||||
]
|
||||
},
|
||||
facts,
|
||||
)
|
||||
|
||||
self.assertEqual(
|
||||
[change["operation"] for change in changes[:3]],
|
||||
[
|
||||
"remove_unknown_source_id",
|
||||
"remove_unknown_source_id",
|
||||
"remove_empty_group",
|
||||
],
|
||||
)
|
||||
|
||||
def test_unknown_id_removal_interacts_with_duplicate_repair(self):
|
||||
facts = fact_items(canonicalized_fixture())
|
||||
repaired, changes = repair_model_group_coverage(
|
||||
{
|
||||
"groups": [
|
||||
self.group("First", ["fact_0001", "unknown_a"], "First."),
|
||||
self.group("Second", ["fact_0001", "fact_0002"], "Second."),
|
||||
]
|
||||
},
|
||||
facts,
|
||||
)
|
||||
|
||||
self.assertEqual(repaired["groups"][0]["source_item_ids"], ["fact_0001"])
|
||||
self.assertEqual(repaired["groups"][1]["source_item_ids"], ["fact_0002"])
|
||||
self.assertEqual(
|
||||
[change["operation"] for change in changes],
|
||||
["remove_unknown_source_id", "remove_duplicate_source_id"],
|
||||
)
|
||||
validate_model_groups(repaired, {"fact_0001", "fact_0002"})
|
||||
|
||||
def test_unknown_removal_and_missing_id_singleton_restoration(self):
|
||||
facts = fact_items(canonicalized_fixture())
|
||||
repaired, changes = repair_model_group_coverage(
|
||||
{
|
||||
"groups": [
|
||||
self.group("Supported", ["fact_0001", "unknown_a"], "Partial.")
|
||||
]
|
||||
},
|
||||
facts,
|
||||
)
|
||||
|
||||
self.assertEqual(repaired["groups"][-1]["source_item_ids"], ["fact_0002"])
|
||||
self.assertEqual(
|
||||
[change["operation"] for change in changes],
|
||||
["remove_unknown_source_id", "restore_missing_source_id_as_singleton"],
|
||||
)
|
||||
validate_model_groups(repaired, {"fact_0001", "fact_0002"})
|
||||
|
||||
def test_final_validator_still_rejects_unknown_source_id(self):
|
||||
with self.assertRaisesRegex(ConsolidationValidationError, "unknown"):
|
||||
validate_model_groups(
|
||||
{"groups": [self.group("Unsupported", ["fact_9999"], "Bad ID.")]},
|
||||
{"fact_0001"},
|
||||
)
|
||||
|
||||
def test_merged_group_validation(self):
|
||||
groups = validate_model_groups(
|
||||
{
|
||||
|
||||
Reference in New Issue
Block a user