package check import ( "strings" "git.novox.be/novox/mesh-delivery/modules/mesh-delivery-builder/buildrun" "git.novox.be/novox/mesh-sdk/go/buildstep" "git.novox.be/novox/mesh-sdk/go/delivery" ) // **An ask the build seat gave up on ends its step** (novox/hq issue 734): mesh-sdk buildrun.LostAskWaiter hands the // waiting asker a failed step on the node buildrun.LostNode when DEAD_LETTERS keeps the ask's copy (buildrun.HearDeadLetters, // granted by buscompose DeadLetterReads), and, under buildrun.NotTakenBound, when no build node took the ask within the // bound. What follows is the checker's: a try ends as error (Tryer.run), with the not-taken bound at the step bound // (Tryer.NotTaken); a check is asked again under its claim, at most LostAskTries times, then fails as not heard and is // judged again when the nodes change (Checker.try). A check's ask has no not-taken bound: it waits in the stream as long as // the backlog is (ADR 0525 ยง9), and a check ended for a backlog would owe its pull request a failure. // LostAskTries is how often a check asks again whose ask was given up, before it fails as not heard (UnheardWords) and is // judged again when the nodes change. const LostAskTries = 3 // IsLostAsk says whether a verdict failed because its ask judged nothing: the build seat gave it up (buildrun.LostWords), or // the build module that ran its step was replaced under it, and its next process ended the step it left running // (buildstep.RestartReason; a delivery of the build module, as on 2026-10-28). Neither is the change's failure: the check // is asked again, as for a given-up ask. func IsLostAsk(v delivery.Verdict) bool { return v.State == delivery.VerdictFail && (strings.Contains(v.Failed.Words, buildrun.LostWords) || strings.Contains(v.Failed.Words, buildstep.RestartReason)) } // IsNotTaken says whether a verdict failed because no build node took its ask within the bound (buildrun.NotTakenWords). func IsNotTaken(v delivery.Verdict) bool { return v.State == delivery.VerdictFail && strings.Contains(v.Failed.Words, buildrun.NotTakenWords) } // HearingBucket is the checker's state hearing: whether it hears DEAD_LETTERS (buildrun.Hearing under // buildrun.HearingKey), which checker_status says (dead_letters). const HearingBucket = delivery.CheckerModule + "_" + buildrun.HearingState