commit e57e0c9c5e586e4863cadf39c508c5c999b3950a
parent 3d7d5bab6c51ba409c386a8ecde9c5ae23148707
Author: triesap <tyson@radroots.org>
Date: Mon, 21 Sep 2026 12:59:14 +0000
core: separate harvest age from record recency
Diffstat:
2 files changed, 45 insertions(+), 0 deletions(-)
diff --git a/src/hyf_core/domain/freshness.mojo b/src/hyf_core/domain/freshness.mojo
@@ -0,0 +1,29 @@
+
+
+@fieldwise_init
+struct Freshness(Copyable, Movable):
+ var record_age_minutes: Int
+ var harvest_age_minutes: Int
+ var verification_age_minutes: Int
+
+
+def freshness(
+ record_age_minutes: Int,
+ harvest_age_minutes: Int,
+ verification_age_minutes: Int,
+) raises -> Freshness:
+ if record_age_minutes < 0:
+ raise Error("record age must be non-negative")
+ if harvest_age_minutes < 0:
+ raise Error("harvest age must be non-negative")
+ if verification_age_minutes < 0:
+ raise Error("verification age must be non-negative")
+ return Freshness(
+ record_age_minutes=record_age_minutes,
+ harvest_age_minutes=harvest_age_minutes,
+ verification_age_minutes=verification_age_minutes,
+ )
+
+
+def record_recency_implies_harvest_age() -> Bool:
+ return False
diff --git a/tests/test_domain.mojo b/tests/test_domain.mojo
@@ -307,3 +307,19 @@ def test_local_time_ambiguity_and_window_boundaries() raises:
assert_true(window_contains(20717, 20721, "exclusive", 20720))
with assert_raises():
_ = window_contains(1, 2, "half-open", 1)
+
+
+from hyf_core.domain.freshness import (
+ freshness,
+ record_recency_implies_harvest_age,
+)
+
+
+def test_freshness_separates_record_harvest_and_verification() raises:
+ var value = freshness(5, 240, 60)
+ assert_equal(value.record_age_minutes, 5)
+ assert_equal(value.harvest_age_minutes, 240)
+ assert_equal(value.verification_age_minutes, 60)
+ assert_true(not record_recency_implies_harvest_age())
+ with assert_raises():
+ _ = freshness(-1, 0, 0)