commit c45dd485c53954264f01f02f4fcd11d20f4fe863
parent 36e067b51094b7b375748cbe201db52cbae96173
Author: triesap <tyson@radroots.org>
Date: Mon, 21 Sep 2026 13:50:20 +0000
core: handle farm inference failures safely
Diffstat:
2 files changed, 47 insertions(+), 0 deletions(-)
diff --git a/src/hyf_application/farm_failure.mojo b/src/hyf_application/farm_failure.mojo
@@ -0,0 +1,28 @@
+
+
+@fieldwise_init
+struct FarmInferenceOutcome(Copyable, Movable):
+ var status: String
+ var confirmed_claims: Int
+ var unresolved_claims: Int
+ var reason: String
+
+
+def farm_inference_failure(reason: String) raises -> FarmInferenceOutcome:
+ if String(reason).strip().byte_length() == 0:
+ raise Error("inference failure requires a reason")
+ return FarmInferenceOutcome(
+ status="failed", confirmed_claims=0, unresolved_claims=1, reason=String(reason)
+ )
+
+
+def farm_inference_degraded(reason: String) raises -> FarmInferenceOutcome:
+ if String(reason).strip().byte_length() == 0:
+ raise Error("inference degradation requires a reason")
+ return FarmInferenceOutcome(
+ status="degraded", confirmed_claims=0, unresolved_claims=1, reason=String(reason)
+ )
+
+
+def inference_failure_confirms_stock() -> Bool:
+ return False
diff --git a/tests/test_application.mojo b/tests/test_application.mojo
@@ -188,3 +188,22 @@ def test_farm_clarification_is_revisioned_new_evidence() raises:
"quantity.unreserved", "farm-source-1", "r2", "60 lb", "r3"
)
)
+
+
+from hyf_application.farm_failure import (
+ farm_inference_degraded,
+ farm_inference_failure,
+ inference_failure_confirms_stock,
+)
+
+
+def test_farm_inference_failure_never_confirms_stock() raises:
+ var failed = farm_inference_failure("provider_timeout")
+ assert_equal(failed.status, "failed")
+ assert_equal(failed.confirmed_claims, 0)
+ assert_equal(failed.unresolved_claims, 1)
+ var degraded = farm_inference_degraded("provider_degraded")
+ assert_equal(degraded.status, "degraded")
+ assert_true(not inference_failure_confirms_stock())
+ with assert_raises():
+ _ = farm_inference_failure("")