# Resolver Contract Tests Tests that any resolver implementation must pass. --- ## RT_001 — Arithmetic resolution ``` Input WorldState: Objects: Q1 (value=5, unit=apples), Q2 (value=2, unit=apples), Q_result (value=null) Constraints: C1 = quantity_difference(Q_result, Q1, Q2), status=unresolved Expected resolved WorldState: Q_result.QuantityFacet.value = 3 Q_result.QuantityFacet.is_exact = true Q_result.QuantityFacet.unit = "apples" C1.status = "resolved" resolution_log contains entry for "resolve_arithmetic" affecting Q_result ``` --- ## RT_002 — Coreference merge ``` Input WorldState: Objects: E1 (Alice, confidence=0.97), E_she (She, confidence=0.72) Constraints: C_coref = same_entity(E1, E_she), status=resolved Expected resolved WorldState: E_she.status = "merged" E_she.merged_into = "E1" E1.aliases contains "She" All facet_refs and constraint_refs from E_she transferred to E1 resolution_log contains entry for "merge_coreference" ``` --- ## RT_003 — Contradiction detected and logged ``` Input WorldState: Constraints: C1 = before(EV1, EV2), strength=hard, status=unresolved C2 = before(EV2, EV1), strength=hard, status=unresolved Expected: C1.status = "contradicted" C2.status = "contradicted" open_contradictions contains record with constraint_refs = ["C1", "C2"] NO silent resolution ``` --- ## RT_004 — Soft constraint suspended by hard conflict ``` Input WorldState: C1 = quantity_equals(Q1, 5), strength=hard, status=resolved C2 = quantity_equals(Q1, 7), strength=soft, status=unresolved Expected: C2.status = "suspended" resolution_log contains "suspend_soft" entry for C2 Q1.value = 5 (unchanged) ``` --- ## RT_005 — No new objects created ``` Input WorldState: N objects Expected: resolved WorldState has <= N objects (merges reduce count; splits would increase but must be explicitly supported) ``` --- ## RT_006 — Resolution log completeness ``` For any non-trivial WorldState: Every object status change must have a log entry Every constraint status change must have a log entry resolution_log must be non-empty ``` --- ## RT_007 — Stage check ``` Input: WorldState with stage = "post_gate" Expected: resolver raises error or returns error state, does not produce resolved output ``` --- ## RT_008 — Idempotency ``` Call resolver(WorldState) → resolved_1 Call resolver(resolved_1) → resolved_2 Expected: resolved_1 and resolved_2 are logically equivalent (no new changes on second pass) ``` --- ## RT_009 — Confidence propagation bounds ``` Given any resolved constraint affecting object O: O.confidence must not increase by more than 0.15 from a single constraint O.confidence must not decrease by more than 0.15 from a single contradiction O.confidence must remain in [0.0, 1.0] ``` --- ## RT_010 — Resolver interface replaceability ``` Given a resolver interface: resolve(world_state) → world_state Any implementation that passes RT_001 through RT_009 is a valid resolver. The rest of the pipeline must not depend on resolver internals. ```