Reference
Conditions and events
Every status condition a ManagedWorkload reports, with each reason and what it means, and every event Napwake emits.
Status conditions
Section titled “Status conditions”Each has a Reason, a Message and a LastTransitionTime. A condition appears once it first applies. After that it shows False with a False reason below, rather than going. Only GitOpsConflict and Autoscaled are removed.
| Type | True means |
Reasons |
|---|---|---|
#TargetAvailable |
The target exists, and is managed | TargetExists. False: TargetNotFound, TargetIgnored (labelled napwake.dev/ignore) |
#MetricsAvailable |
CPU can be measured, for the activity clock and forecast | MetricsReported. Unknown: NoReadyPods, AwaitingPodMetrics, while new pods have no metrics. False: NoPodMetrics, NoCPURequests, MetricsUnavailable |
#PrometheusAvailable |
The activity queries answer. Only set when there are some | QueriesEvaluated. False: QueryFailed, EndpointNotConfigured |
#PrometheusQueryEmpty |
A query has matched no series since first evaluated, usually from a misspelt metric or label. It doesn’t stop a pause | NoSeries. False: QueriesMatchSeries |
#IdleVetoed |
Idle, but a confident forecast expects demand in the coming hour, which the message names. The pause waits | ForecastExpectsDemand. False: NotVetoed |
#WakeOnRequest |
Its Services are routed to the doorman while paused, so a request wakes it, or with wake.mode: Ask a person’s click. With Ask, its message says the doorman asks a person’s browser first, and turns away other requests. A Services problem stays once it’s awake, the message starting at its last pause: |
DoormanRouted. False: why it isn’t routed (NoServices, ServedByOtherPods, UnsupportedIPFamily, UnsupportedLoadBalancer, ForwarderNotReady, DoormanUnavailable, NoFreePort, TooManyPorts, RoutingFailed, DoormanDisabled, NodeLocalTraffic). NotPaused, TargetNotFound, DuplicateTarget once routing is removed |
#HeldByDependents |
Kept awake for its dependents | DependentsAwake. False: NoAwakeDependents, or NotIdle once its own activity restarts its clock |
#WaitingForDependencies |
Its resume waits for a waitForReady dependency to be Ready |
DependencyNotReady. False: DependenciesReady. Also DependencyWontStart, naming a dependency it doesn’t wait for, as it can’t start or wasn’t Ready in time. Or DependencyCycle, naming one that waits for it in turn |
#DependencyCycle |
dependsOn forms a cycle through it, so it won’t pause |
DependencyCycle. False: NoCycle |
#DependencyNotFound |
A dependsOn workload doesn’t exist, or can’t be seen |
DependencyNotFound, or DependencyNotVisible when it’s only outside watchNamespaces or not readable. False: DependenciesFound, NoDependencies |
#DependencyNotAllowed |
A dependency, declared or learned, is in a namespace whose napwake.dev/dependents-from doesn’t list this one. It isn’t held, woken or waited for |
DependencyNotAllowed. False: DependenciesAllowed, NoDependencies |
#DuplicateTarget |
An older ManagedWorkload manages the target. This one hands back any pause it made, then does nothing | DuplicateTarget. False: Resolved |
#Protected |
It’s never paused. It’s in a protected namespace, Napwake’s own operator or doorman, or a StatefulSet that deletes its PVCs when scaled down | ProtectedNamespace, NapwakeComponent, PVCsDeletedOnScaleDown. False: NotProtected |
#PauseRequest |
The last pause request paused it, or found it paused. False says why not. Until the next request, it says what happened and when, such as paused as requested at 2026-10-21 03:32 UTC |
Paused, AlreadyPaused. False: DryRun, ForecastExpectsDemand, ActiveUntil, HeldByDependents, DependencyCycle, Protected, ScaledToZero, TargetNotFound, TargetIgnored, DuplicateTarget, PredatesStatus, PauseCancelled (a request came as it paused) |
#WakeRequest |
The last wake request woke it, or found it awake. False says why not. Until the next request, it says what happened and when, such as woken as requested at 2026-10-21 03:32 UTC |
Woken, AlreadyAwake. False: TargetNotFound, TargetIgnored, DuplicateTarget, Protected, ScaledToZero, BeingDeleted, PredatesStatus |
#GitOpsConflict |
A GitOps tool undid its last pause. Removed once a pause holds for an hour | PauseUndone |
#ResumeIncomplete |
The last resume stopped waiting with replicas not Ready. It runs with the Ready ones until all are (troubleshooting) | ReplicasNotReady. False: AllReplicasReady |
#PauseIncomplete |
The last pause stopped waiting for pods still running a minute past their termination grace period. It’s Paused regardless (troubleshooting) |
PodsStillRunning. False: PodsStopped, NotPaused |
#PausedWhileInUse |
Its own use undid its last pause soon after it began. So its idle clock waits longer, until a pause holds. The message says what to change (Paused while in use) | WokenSoonAfterPause, PauseCancelled. False: PauseHeld |
#Autoscaled |
An HPA or KEDA ScaledObject scales it, with its range. Removed when neither does (HPA and KEDA) | HPA, KEDA |
#ScaledToZero |
Scaled to zero outside Napwake, so left off. Not paused, woken or routed until its replicas are above zero | ScaledToZero. False: HasReplicas |
Events
Section titled “Events”Each user-visible change emits one event, as it happens, shown by kubectl describe. The opt-in controller puts #Managed, #NoLongerManaged, #InvalidSetting, #LabelIgnored and #Protected on the Deployment or StatefulSet itself. In dry-run, events for decisions it holds back start with [dry-run] (Dry run).
Every event on the ManagedWorkload, by what it’s about.
| About | Events |
|---|---|
| The lifecycle | #IdleDetected, #PausedEarly (brought forward by pauseEarly), #PauseRequested, #Paused, #Resumed, #ActivityResumed (in dry-run, with what the pause would have freed), #Unobserved (a gap in watching restarted the idle clock, and how long it was) |
| Its pause record lost from status | #PauseRecovered (from the target’s napwake.dev/paused-from). The warning #PauseRecordLost (nothing to finish it from) |
| A pause request not acted on | Its reason says why, as the PauseRequest condition’s does |
| A wake request not acted on | Its reason says why, as the WakeRequest condition’s does |
| What woke it | #WokeByActivity, #WokenByRequest (from the doorman, saying a person asked when it’s a click on Wake it), #WakeRequested (from napwake.dev/wake-requested, as kubectl napwake wake sets it), #AutoResume, #ScaledUp, #DryRunWake, and #PauseCancelled (whatever would wake it came as it paused, so the pause was called off) |
| A pause made while it was in use | The warning #PausedWhileInUse, with what to change (Paused while in use) |
| Left off, scaled to zero outside Napwake | #ScaledToZero |
| What holds it awake | #IdleVetoed, #HeldByDependents, #DependencyCycle |
| A GitOps tool undoing a pause | #GitOpsConflict, and #GitOpsConflictResolved when that ends |
| Dependencies | The warnings #DependencyWontStart and DependencyCycle (a resume not waiting for a waitForReady dependency) and #DependencyWakeFailed (one couldn’t be woken). #DependenciesLearned, for learned ones |
| The forecast | #PredictionFed each hour it learns, #RegimeChange when demoted, #ForecastReset when its saved state can’t be read. When Napwake begins managing a workload, #ForecastLearnedHistory if it learned the CPU history from Prometheus. #ForecastLearningLive if there was none, or the warning if it couldn’t be read |
| The GKE NEG forwarder | #ForwarderStarted beside a paused workload, #ForwarderStopped once it’s removed after the wake |
| Problems | #TargetNotFound, #DuplicateTarget, #NoPodMetrics, #NoCPURequests, , #QueryFailed, #EndpointNotConfigured, #PrometheusQueryEmpty, #InvalidActivityAnnotation, #RoutingFailed, #UnsupportedLoadBalancer, #RequestNotServed, #Protected, and these: |
| Problem | Means |
|---|---|
#NoReadinessProbe |
A routed workload’s pods have no readiness probe, so a waking request may reach the app before it can answer (Readiness probes) |
#ResumeIncomplete |
In place of Resumed, when the resume stopped waiting for replicas not Ready. #AllReplicasReady once they are |
#PauseIncomplete |
In place of Paused, when the pause stopped waiting for pods that didn’t stop |
#HandBackAbandoned |
A ManagedWorkload in a namespace being deleted let go of its workload |
#ManagedByAnotherInstall |
This install leaves the ManagedWorkload to the one that took it on |