Repair hallucinated Semantic Consolidator source IDs

This commit is contained in:
2026-08-09 14:59:27 +02:00
parent 58effcafc5
commit 0b24351127
4 changed files with 240 additions and 11 deletions
+130
View File
@@ -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(
{