Cross-CRD reference for the condition types and reasons emitted by fleet-management-operator. Use this table to write generic alerting and dashboard queries (e.g. "any CR with Ready=False for >10m" across the entire CRD family).
The source of truth is the internal/controller/*.go const blocks listed under each subsystem; this document mirrors them. Anyone adding a new condition type or reason must update this file in the same PR.
Reason strings are short PascalCase identifiers. They are stable: a reason name is never repurposed across releases. Renames go through an additive-then-remove window.
Fetch returned records and the claim was applied. On Stalled, signals recovery from a prior empty fetch.
SourceFailed
Ready, Synced
Source Fetch returned a non-nil error.
Stalled
Ready, Synced, Stalled
Fetch returned 0 records and spec.allowEmptyResults=false; claim preserved. Surfaced on all three condition types so generic alerts and the dedicated Stalled lane stay consistent.
InvalidSchedule
Ready, Synced
spec.schedule failed both duration and cron parsers.
OwnedKeysExceeded
Ready, Synced, Truncated
ownedKeys exceeded the supported cap; the sync is not Ready because the claim would be partial.
Ready=True means the CR is fully usable. Partial success is Ready=False with a specific reason; no half-Ready states.
Conditions are written via meta.SetStatusCondition from k8s.io/apimachinery/pkg/api/meta so LastTransitionTime is managed correctly.
Conditions are persisted via Status().Update() only — never Update().
ObservedGeneration on each condition reflects the spec generation observed when the condition was set; status-level observedGeneration is updated alongside.
Event reasons (emitted via record.EventRecorder) intentionally mirror condition reasons where appropriate but are tracked separately in each controller's *EventReason* consts. Event reasons are not part of this registry — they are user-facing log text, not API surface.