Skip to content
Docs
Release candidateThese docs are for Napwake 0.2.0-rc.9, a release candidate, and may change before it's released. Read the docs for the latest release.

Reference

Conditions and events

Every status condition a ManagedWorkload reports, with each reason and what it means, and every event Napwake emits.

View .mdAsk Claude (opens claude.ai)Ask ChatGPT (opens chatgpt.com)

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

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 #ForecastHistoryUnavailable 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, #MetricsUnavailable, #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