commit 115d11a98470f60f186a87f2474d082bc8500bdb
parent ee57d4c46248eeb60674b780a0fbe6e5bbc30ef7
Author: triesap <tyson@radroots.org>
Date: Mon, 21 Sep 2026 13:00:28 +0000
core: add revisioned clarification merge rules
Diffstat:
2 files changed, 61 insertions(+), 0 deletions(-)
diff --git a/src/hyf_core/domain/clarification.mojo b/src/hyf_core/domain/clarification.mojo
@@ -0,0 +1,42 @@
+from hyf_core.domain.field import DecodedField, known_field
+
+
+@fieldwise_init
+struct ClarificationEvidence(Copyable, Movable):
+ var target_field: String
+ var source_id: String
+ var revision: String
+ var text: String
+
+
+def clarification_evidence(
+ target_field: String, source_id: String, revision: String, text: String
+) raises -> ClarificationEvidence:
+ if target_field.strip() == "":
+ raise Error("clarification requires a target field")
+ if source_id.strip() == "" or revision.strip() == "":
+ raise Error("clarification requires source id and revision")
+ if text.strip() == "":
+ raise Error("clarification text must not be empty")
+ return ClarificationEvidence(
+ target_field=String(target_field),
+ source_id=String(source_id),
+ revision=String(revision),
+ text=String(text),
+ )
+
+
+def clarification_is_stale(
+ evidence: ClarificationEvidence, current_revision: String
+) -> Bool:
+ return evidence.revision != current_revision
+
+
+def apply_clarification(
+ original: DecodedField,
+ evidence: ClarificationEvidence,
+ resolved_value: String,
+) raises -> DecodedField:
+ var refined = known_field(resolved_value, "clarification")
+ refined.qualifier = original.qualifier
+ return refined^
diff --git a/tests/test_domain.mojo b/tests/test_domain.mojo
@@ -402,3 +402,22 @@ def test_review_state_optional_price_does_not_block_withdrawal_does() raises:
assert_equal(len(blocked.clarifications), 1)
var extended = review_add(blocked, "quantity.unreserved", "stock_unknown")
assert_equal(len(extended.clarifications), 2)
+
+
+from hyf_core.domain.clarification import (
+ apply_clarification,
+ clarification_evidence,
+ clarification_is_stale,
+)
+
+
+def test_clarification_refines_without_overwriting_original() raises:
+ var original = known_field("80", "span")
+ var evidence = clarification_evidence(
+ "quantity.unreserved", "farm-source-1", "r2", "60 lb unreserved"
+ )
+ var refined = apply_clarification(original, evidence, "60")
+ assert_equal(original.value.value(), "80")
+ assert_equal(refined.value.value(), "60")
+ assert_true(not clarification_is_stale(evidence, "r2"))
+ assert_true(clarification_is_stale(evidence, "r3"))