31 lines
1.6 KiB
Go
31 lines
1.6 KiB
Go
package domain
|
|
|
|
import "git.cin.su/m/Assistant/contracts/epistemics"
|
|
|
|
// AssessFreshness receives the Work-owned requirement as primitive policy
|
|
// inputs, keeping the Epistemics owner independent of Work package types.
|
|
func AssessFreshness(applicability epistemics.TemporalApplicability, mode string, maximumAgeMillis *int64, nowMillis int64) epistemics.FreshnessAssessment {
|
|
age := nowMillis - applicability.ObservedAtUnixMillis
|
|
if age < 0 {
|
|
age = 0
|
|
}
|
|
state := epistemics.FreshnessAssessmentCurrent
|
|
reason := "observation is within applicability window"
|
|
if applicability.ValidUntilUnixMillis != nil && nowMillis > *applicability.ValidUntilUnixMillis {
|
|
state, reason = epistemics.FreshnessAssessmentStale, "valid-until elapsed"
|
|
}
|
|
if applicability.Volatility.HardStaleAfterMillis != nil && age > *applicability.Volatility.HardStaleAfterMillis {
|
|
state, reason = epistemics.FreshnessAssessmentStale, "hard volatility window elapsed"
|
|
}
|
|
if applicability.Volatility.RevalidateAfterMillis != nil && age > *applicability.Volatility.RevalidateAfterMillis && state == epistemics.FreshnessAssessmentCurrent {
|
|
state, reason = epistemics.FreshnessAssessmentAging, "revalidation window elapsed"
|
|
}
|
|
if maximumAgeMillis != nil && age > *maximumAgeMillis {
|
|
state, reason = epistemics.FreshnessAssessmentStale, "task maximum age exceeded"
|
|
}
|
|
if mode == "LIVE_REQUIRED" {
|
|
state, reason = epistemics.FreshnessAssessmentHistoricalOnly, "live source required"
|
|
}
|
|
return epistemics.FreshnessAssessment{SourceKnowledgeRef: "knowledge", TaskRef: "task", State: state, Reason: reason, AgeMillis: age, AssessedAtUnixMillis: nowMillis}
|
|
}
|