mesh/merge-gate pass: builds build-agent, mesh-controller, route-proxy → ace, g14, novox, shanks; no bus step; every machine composes with the change as it…
mesh/repo-check pass: its merge-check.sh passed
mesh/delivery delivered
mesh/delivery-group group fix/notifications-after-review delivered: every member is delivered
Review found that a desk click proves nothing about who chose, that refused words could turn "Needs you" into "Nothing for you to do", that sound words were refused, and that a quiet warning whose words came to need the operator was never said (hq ADR 0258).
77 lines
3.3 KiB
Go
77 lines
3.3 KiB
Go
package conditions
|
|
|
|
import "time"
|
|
|
|
// The events a condition's life emits (to-be 45 §2), as the mesh-controller seat's own: published on
|
|
// `mesh.seat.mesh-controller.event.<name>`, on the events stream, so a consumer that was away catches
|
|
// up. **This is a contract**: the operator-channel's holder is written against these names and the
|
|
// shape of Event, and the controller learns nothing about telling.
|
|
const (
|
|
// EventRaised: a condition was raised — new, or the same fault again within ReopenWithin of its
|
|
// clearing (Change says which). A reopened condition is not news: its key is the one the
|
|
// first message was about.
|
|
EventRaised = "condition-raised"
|
|
// EventChanged: its severity, its resolver or its silence changed. Not every observation: a
|
|
// condition observed again is written, and says nothing.
|
|
EventChanged = "condition-changed"
|
|
// EventCleared: an observation says it is resolved. The condition is removed from the store and
|
|
// the transition kept in its history.
|
|
EventCleared = "condition-cleared"
|
|
)
|
|
|
|
// Events is every event a condition's life emits.
|
|
var Events = []string{EventRaised, EventChanged, EventCleared}
|
|
|
|
// HeartbeatEvent is the self-check's heartbeat (to-be 45 §4, S10), said under the same seat at the end
|
|
// of every run: `{run, at, interval-seconds, counts: {passed, failed, failed-to-run, deferred}, probes,
|
|
// controller, why}`. mesh-watcher, on a machine that is not the control node, listens for it.
|
|
const HeartbeatEvent = "doctor-heartbeat"
|
|
|
|
// What changed, as an event's Change and a history entry's says it.
|
|
const (
|
|
ChangeRaised = "raised"
|
|
ChangeReopened = "reopened"
|
|
ChangeSeverity = "severity"
|
|
ChangeResolver = "resolver"
|
|
ChangeSilenced = "silenced"
|
|
ChangeUnsilenced = "silence-ended"
|
|
ChangeCleared = "cleared"
|
|
// ChangeWords is what the operator needs, or the answers offered, said differently (novox/hq ADR
|
|
// 0258): a warning kept quiet as needing nothing is said once its words need the operator.
|
|
ChangeWords = "words"
|
|
)
|
|
|
|
// Event is the body of every condition event, and the shape a history entry keeps: **the condition
|
|
// itself, at the top level** — key, kind, subject, severity, summary, source, raised, last-observed,
|
|
// observations, resolver, silenced (null when not), epoch, and the evidence — with what happened to
|
|
// it beside. One object a consumer reads the same way whichever of the three it is.
|
|
type Event struct {
|
|
// Condition is the condition after the transition — as it was last held, for a clearing.
|
|
Condition
|
|
// Event is the event's own name, so a body read without its subject still says what it is.
|
|
Event string `json:"event"`
|
|
// At is when the transition happened.
|
|
At time.Time `json:"at"`
|
|
// Change is what happened: raised, reopened, severity, resolver, silenced, silence-ended, cleared.
|
|
Change string `json:"change"`
|
|
// Was is the value before, for a severity or resolver change.
|
|
Was string `json:"was,omitempty"`
|
|
// Why says why it cleared, or why it was silenced.
|
|
Why string `json:"why,omitempty"`
|
|
// Cleared is when it cleared, on a clearing.
|
|
Cleared *time.Time `json:"cleared,omitempty"`
|
|
// Show is the verb that shows more.
|
|
Show string `json:"show"`
|
|
}
|
|
|
|
// eventFor is the event a change is said under.
|
|
func eventFor(change string) string {
|
|
switch change {
|
|
case ChangeRaised, ChangeReopened:
|
|
return EventRaised
|
|
case ChangeCleared:
|
|
return EventCleared
|
|
}
|
|
return EventChanged
|
|
}
|