Conditions Reference#
Every AIM resource reports its state through standard Kubernetes conditions. This page catalogs all conditions, their reasons, and what triggers them.
Reading conditions#
kubectl get aimservice <name> -o jsonpath='{.status.conditions}' | jq
Each condition has:
type — The condition name (e.g.,
Ready)status —
True,False, orUnknownreason — Machine-readable cause
message — Human-readable description
lastTransitionTime — When the status last changed
Framework conditions#
These conditions are managed by the reconciliation framework and appear on all AIM resources.
DependenciesReachable#
Whether upstream dependencies (referenced models, profiles, configs) can be fetched.
Status |
Reason |
Description |
|---|---|---|
|
|
All dependencies are reachable |
|
|
Cannot reach one or more dependencies |
AuthValid#
Whether authentication and authorization for referenced secrets and registries are valid.
Status |
Reason |
Description |
|---|---|---|
|
|
Authentication and authorization successful |
|
|
Authentication or authorization failure |
ConfigValid#
Whether the resource’s spec is valid and all referenced resources exist.
Status |
Reason |
Description |
|---|---|---|
|
|
Configuration is valid |
|
|
Configuration validation failed |
|
|
|
|
|
The scale-from-zero activation metric query cannot be resolved. See ScaleToZeroConfig. |
|
|
Autoscaling is configured but no scaling trigger resolves. See AutoscalingConfig. |
|
|
A referenced resource does not exist |
Ready#
Overall readiness — the aggregate of all other conditions and component health.
Status |
Reason |
Description |
|---|---|---|
|
|
All components are ready |
|
|
One or more components are not ready |
|
|
Waiting for components to become ready |
AIMService conditions (v1alpha2)#
AIMService reports per-component conditions in addition to the framework conditions. The condition catalog covers profile resolution, cache, KServe runtime, routing, and autoscaling.
ProfileReady#
Status |
Reason |
Description |
|---|---|---|
|
|
Profile found and is deployable |
|
|
No matching |
|
|
Profile exists but its own |
|
|
|
|
|
Selector returned multiple equally-scored candidates |
When ProfileReady=False, the controller suppresses downstream component conditions (InferenceServiceReady, HTTPRouteReady) — the resources aren’t being created until profile resolution succeeds.
ModelReady#
Set when spec.model is used (by-model, model+selector, or model.image with the v1alpha2 profile-pipeline annotation).
Status |
Reason |
Description |
|---|---|---|
|
|
Model found and ready |
|
|
Referenced model does not exist |
|
|
Model exists but is not ready |
|
|
Auto-creating a model from |
RuntimeConfigReady#
Status |
Reason |
Description |
|---|---|---|
|
|
Runtime config found (or no runtime config required) |
|
|
Referenced runtime config does not exist |
ProfileCacheReady#
Replaces v1alpha1’s CacheReady. Tracks the AIMProfileCache lifecycle.
Status |
Reason |
Description |
|---|---|---|
|
|
All cache artifacts are downloaded and verified |
|
|
Creating the profile cache |
|
|
Cache exists but download is incomplete |
|
|
Cache download failed |
|
|
Previously-ready cache is no longer available |
ProfileRuntimeReady#
Tracks the namespaced profile ServingRuntime and its same-name ConfigMap
before AIM Engine creates or updates the InferenceService.
Status |
Reason |
Description |
|---|---|---|
|
|
Both projection siblings match the current profile and cache content hash |
|
|
One or both projection siblings do not exist yet |
|
|
Both siblings exist, but one or both have not converged to the expected content hash |
|
|
AIM Engine could not read one of the projection siblings |
ProfileRuntimeConverging can be transient because the two resources are
updated independently. If it persists, check for unsupported out-of-band
changes to generated aim-* resources. See
Consistency and rollout guarantees.
InferenceServiceReady#
Status |
Reason |
Description |
|---|---|---|
|
|
KServe |
|
|
Creating or updating the InferenceService |
|
|
Replica scaling in progress |
InferenceServicePodsReady#
Tracks whether the predictor pods are running and ready.
HTTPRouteReady#
Set only when spec.routing.enabled: true.
Status |
Reason |
Description |
|---|---|---|
|
|
|
|
|
|
|
|
|
|
|
Routing enabled but no |
HPAReady#
Set only when spec.minReplicas / spec.maxReplicas are configured.
Status |
Reason |
Description |
|---|---|---|
|
|
HPA is active and metrics are available |
|
|
Waiting for KEDA to create HPA |
|
|
InferenceService not ready yet; metrics unavailable |
ActivationMetricAvailable#
Reports whether the HPA has read KEDA’s zero-to-one activation trigger. AIM Engine first verifies that scale-to-zero routing and the selected gateway provider’s activation query are valid. It then checks that the HPA spec contains the expected number of external metrics—one activation trigger plus every resolved user scaling trigger—before resolving the exact s0-* metric and requiring the same name with a current value in HPA.status.currentMetrics. This prevents a stale user-only HPA from being mistaken for activation evidence during configuration changes. A reported value of zero is valid evidence that the query is readable.
The aggregate HPA ScalingActive condition is diagnostic context only because any s1-* or later user metric can make it True. When s0-* is unavailable, the condition message lists any other external metrics that the HPA did report, but those metrics do not affect the activation verdict.
This condition is informational only — unlike the *Ready conditions it is deliberately excluded from the Ready rollup, so it never changes the service’s status or its scaling behaviour. AIM Engine reports the signal; acting on it is the cluster administrator’s call.
Set only when all of the following hold: spec.minReplicas: 0, routing is enabled, the provider-neutral activation query resolves, the KEDA-managed HPA is observable, and the predictor is currently running at least one replica. Invalid routing or activation-query configuration is reported by ScaleToZeroConfig instead, avoiding duplicate or misleading conditions. The running-replica constraint makes runtime availability unambiguous — KEDA normally retains replicas when a trigger cannot be evaluated. At zero replicas an absent series can be the gateway counter’s normal lazy resting state, so the condition is removed rather than reported.
Status |
Reason |
Description |
|---|---|---|
|
|
The HPA reported the exact |
|
|
Waiting for the HPA to report that exact metric, within the grace period covering HPA creation and transient collector restarts |
|
|
The HPA has not reported that exact metric for longer than the grace period; the service may not wake after scaling to zero. Emits a warning event. |
When ActivationMetricUnavailable is reported, compare the HPA’s s0-* spec metric with its currentMetrics entries, then verify the selected gateway provider’s activation counter and scale-from-zero collector path. For Envoy Gateway, also verify that the Lua EnvoyExtensionPolicy is accepted and that the gateway has served at least one request for this service’s HTTPRoute (the counter is created lazily on first request). See Optional Envoy Gateway scale-from-zero for policy installation and verification.
ScaleToZeroConfig#
Validates that routing is enabled when spec.minReplicas: 0 is set. The
scale-from-zero trigger depends on a gateway metric associated with an
HTTPRoute; without routing, the service could not wake from zero replicas.
Status |
Reason |
Description |
|---|---|---|
|
|
|
|
|
Gateway activation is disabled with |
When valid, this check is silent — no condition or component-health entry is emitted.
AutoscalingConfig#
Validates that whenever autoscaling is configured (spec.minReplicas/spec.maxReplicas/spec.autoScaling) at least one KEDA scaling trigger resolves. The controller stamps autoscalerClass=external on the InferenceService and owns the KEDA ScaledObject directly, but that ScaledObject is only created when a trigger exists — the scale-from-zero activation trigger (minReplicas: 0) or a user-defined spec.autoScaling.metrics entry. Configuring autoscaling with neither leaves the predictor under external scaling control with nothing to drive it, so the declared replica bounds are never enforced (e.g. maxReplicas is set but the deployment never scales). AIM Engine rejects the spec instead of creating it.
Status |
Reason |
Description |
|---|---|---|
|
|
Autoscaling configured but no trigger resolves. Drives |
When valid, this check is silent — no condition or component-health entry is emitted.
AIMModel / AIMClusterModel conditions (v1alpha2)#
DiscoveryReady#
Set only for the official and base-image flows (spec.image set). Tracks the in-cluster discovery Job.
Status |
Reason |
Description |
|---|---|---|
|
|
Discovery cache is populated and the spec hash matches |
|
|
Discovery Job completed and produced a valid cache |
|
|
Discovery Job has been launched |
|
|
Discovery Job is running |
|
|
Discovery completed but logs could not be parsed |
|
|
Discovery cache |
|
|
Discovery Job failed (image pull failure, registry auth, etc.) |
|
|
Could not count current attempts |
|
|
Concurrent discovery cap reached; waiting for slot |
status.discovery.lastFailureReason records the most recent failure reason. The message includes the retry backoff window.
DerivationReady#
Set only for the fine-tuned and custom flows (spec.profiles set). Mirrors the child AIMProfileSet’s DerivationReady.
Status |
Reason |
Description |
|---|---|---|
|
|
All derived profiles are ready |
|
|
Derivation in progress |
|
|
Selector matched zero source candidates |
|
|
One or more derived profiles failed |
Ready (managed profile rollup)#
Status |
Reason |
Description |
|---|---|---|
|
|
All managed profiles are ready |
|
|
Some profiles ready, others |
|
|
No managed profile is ready and at least one is |
|
|
Discovery completed but no supported profiles found |
|
|
A model-ID declaration has no configured fallback matching available hardware; the message identifies rejected fallbacks and node-level causes such as missing labels or insufficient allocatable resources |
|
|
Generated profiles exist, but their matching hardware is no longer available |
|
|
Building the desired profile set failed |
|
|
Node-inventory snapshot built (intermediate state) |
AIMProfileSet / AIMClusterProfileSet conditions#
DerivationReady#
Status |
Reason |
Description |
|---|---|---|
|
|
All managed derived profiles are ready |
|
|
Derivation in progress |
|
|
Selector matched zero source candidates |
|
|
One or more derived profiles failed |
status.managedProfiles.{total,ready,deployable,base,notAvailable} are always populated (zero values serialised explicitly).
AIMProfile / AIMClusterProfile conditions#
HardwareAvailable#
Reports whether the cluster has nodes matching the profile’s accelerator labels and resource requests.
Status |
Reason |
Description |
|---|---|---|
|
|
Matching nodes found in cluster |
|
|
No accelerator requirements — profile is always available |
|
|
No cluster nodes match accelerator labels and resource requests |
The profile controller watches node events and re-evaluates hardware availability whenever node labels change.
RuntimeProjected#
Reports whether the profile is currently projecting a native KServe runtime (ServingRuntime / ClusterServingRuntime). This is informational — it does not gate the profile’s aggregate Ready. See Bring Your Own KServe for the consumer-facing workflow.
Status |
Reason |
Description |
|---|---|---|
|
|
A runtime is projected for this profile |
|
|
The projection gate is no longer satisfied (e.g. matching nodes drained, or the profile is no longer deployable), but a previously-projected runtime is kept, not deleted |
|
|
AIM Engine could not construct a valid projected runtime from the profile |
The condition is silent (absent) when the profile has never projected a runtime. Transient node-list or shared-cache lookup failures preserve its prior value; those outages are reported through framework dependency health instead of being mislabeled as runtime build failures.
Degraded without garbage collection
Projection is additive with asymmetric teardown: a runtime is created only while the profile is projectable, but is never deleted merely because the gate later flips — only when the profile itself is deleted (owner-reference GC). So a runtime object can persist while its profile reports RuntimeProjected=False / RuntimeDegraded. This deliberately avoids yanking a runtime out from under a native InferenceService that references it. The aim.eai.amd.com/runtime-projection-state label on the runtime object marks provenance (projected) and does not currently flip to degraded, so this condition on the profile is the authoritative degraded signal; the runtime’s ownerRef / aim.eai.amd.com/projected.profile annotation is the way back to it.
RuntimeProjectionReady#
Appears only while runtime construction or its shared-cache lookup is failing,
and gates aggregate Ready. It is removed after recovery.
Status |
Reason |
Description |
|---|---|---|
|
|
The profile could not be converted into a valid projected runtime |
|
|
Shared-cache readiness is temporarily unknown; AIM Engine leaves the last-known runtime untouched and retries |
RuntimeProjectionElectionReady#
Appears only when AIM Engine cannot list the profiles needed to elect a
model-slug runtime winner, and gates aggregate Ready. The reason reflects the
categorized dependency error. It is removed after election succeeds.
AIMProfileCache conditions#
ArtifactsReady#
Status |
Reason |
Description |
|---|---|---|
|
|
All artifacts downloaded |
|
|
Creating artifact resources |
|
|
Some artifacts not ready |
AIMArtifact conditions#
Ready#
Status |
Reason |
Description |
|---|---|---|
|
|
Download complete and verified |
|
|
Download in progress |
|
|
Verifying downloaded data |
|
|
Waiting before retrying a failed download |
|
|
Terminal failure |
v1alpha1 conditions#
Legacy v1alpha1 controllers (template-based AIMService, AIMServiceTemplate, AIMTemplateCache) still emit their own condition catalog during the deprecation window. See Legacy Conditions for the full reference.
v1alpha1 AIMService (template path)#
When an AIMService uses spec.template (v1alpha1) the controller emits TemplateReady and CacheReady instead of ProfileReady and ProfileCacheReady:
Condition |
Reasons |
|---|---|
|
|
|
|
v1alpha1 AIMModel (template-emitting path)#
When an AIMModel still emits AIMServiceTemplate resources, its Ready rollup uses the v1alpha1 reason catalog (AllTemplatesReady, SomeTemplatesReady, etc.). See the legacy reference for the full list.
Condition polarity#
All AIM conditions follow positive polarity — status: True means healthy. When building dashboards or alerting:
Green — condition
status: TrueYellow — condition
status: Falsewith reason containingProgressing,Creating,Awaiting,StartedRed — condition
status: Falsewith reason containingFailed,Error,NotFound,Invalid,NotAvailable