A check that failed for a part of the mesh not heard was judged again at every change of the nodes. It now says could not run, naming the part, and is kept in the checker's own state could-not-run; only the running of that part asks it again, once per heads and part at one fingerprint (PartRunning). Not asked again within an hour it is the finding check-could-not-run, which clears when the heads are checked again, replaced, or their pull request closes. checker_status reads the state. The node-engine seat's running event is wired once its definition lands. Claude-Session: https://claude.ai/code/session_01JG73KEq4zoDfM9WtYpcQgZ Builds: design 47 G §253, §315
41 lines
2.5 KiB
Go
41 lines
2.5 KiB
Go
package check
|
|
|
|
import (
|
|
"strings"
|
|
|
|
"git.novox.be/novox/mesh-delivery/contracts/go/clients/meshdeliverycheckerclient"
|
|
"git.novox.be/novox/mesh-delivery/contracts/go/seats/meshdeliverychecker"
|
|
"git.novox.be/novox/mesh-delivery/modules/mesh-delivery-builder/buildrun"
|
|
sdkrun "git.novox.be/novox/mesh-delivery/sdk/buildrun"
|
|
)
|
|
|
|
// **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
|
|
// asked again when the part it could not hear runs (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
|
|
// asked again when the part it could not hear runs.
|
|
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
|
|
// (sdkrun.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 meshdeliverychecker.VerdictsByGroupHeadsValue) bool {
|
|
return v.State == meshdeliverycheckerclient.VerdictFail && (strings.Contains(failedOf(v).Words, buildrun.LostWords) ||
|
|
strings.Contains(failedOf(v).Words, sdkrun.RestartReason))
|
|
}
|
|
|
|
// IsNotTaken says whether a verdict failed because no build node took its ask within the bound (buildrun.NotTakenWords).
|
|
func IsNotTaken(v meshdeliverychecker.VerdictsByGroupHeadsValue) bool {
|
|
return v.State == meshdeliverycheckerclient.VerdictFail && strings.Contains(failedOf(v).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 = CheckerModule + "_" + buildrun.HearingState
|