Skip to content

Evaluation Lifecycle Signals

EvalHub propagates evaluation lifecycle through three Kubernetes-native primitives on every backing Job. Cluster operators, GitOps pipelines, Kyverno policies, and event-driven automation can react to evaluation state without polling the EvalHub API.

SignalKubernetes kindKey / reason
Phase labelJob labeltrustyai.opendatahub.io/evaluation-phase
Lifecycle eventsEventEvaluationRunning · EvaluationCompleted · EvaluationFailed
Status annotationJob annotationtrustyai.opendatahub.io/evaluation-status

The label trustyai.opendatahub.io/evaluation-phase is set on the backing Job and reflects the current lifecycle state.

ValueWhen set
PendingAt Job creation
RunningWhen the adapter container starts processing
CompletedWhen the benchmark finishes successfully
FailedWhen the adapter exits non-zero or an infrastructure failure is detected

Use -L to add the phase as a column in standard kubectl output:

Terminal window
kubectl get jobs -n <tenant-namespace> \
-l app=evalhub \
-L trustyai.opendatahub.io/evaluation-phase
NAME STATUS COMPLETIONS DURATION AGE EVALUATION-PHASE
eval-abc123-... Complete 1/1 3m42s 5m Completed
eval-def456-... Running 0/1 12s 12s Running

Filter to a specific phase using a label selector:

Terminal window
# All completed evaluations
kubectl get jobs -n <tenant-namespace> \
-l trustyai.opendatahub.io/evaluation-phase=Completed
# All failed evaluations
kubectl get jobs -n <tenant-namespace> \
-l trustyai.opendatahub.io/evaluation-phase=Failed

EvalHub emits an Event against the backing Job on each lifecycle transition.

ReasonTypeWhen emitted
EvaluationRunningNormalAdapter starts processing
EvaluationCompletedNormalBenchmark finishes successfully
EvaluationFailedWarningAdapter exits non-zero
Terminal window
# All events for a specific job
kubectl get events -n <tenant-namespace> \
--field-selector involvedObject.name=<job-name>,involvedObject.kind=Job \
--sort-by=.lastTimestamp
# Only failure events
kubectl get events -n <tenant-namespace> \
--field-selector involvedObject.name=<job-name>,involvedObject.kind=Job,reason=EvaluationFailed \
--sort-by=.lastTimestamp

The annotation trustyai.opendatahub.io/evaluation-status is patched on the backing Job at each lifecycle transition and carries a structured JSON payload.

FieldTypeDescription
phasestringCurrent phase value (matches the label)
timestampstringRFC 3339 UTC timestamp of the transition
evaluation_idstringEvalHub evaluation job ID
benchmark_indexintegerIndex of the benchmark within the job
Terminal window
kubectl get job <job-name> -n <tenant-namespace> \
-o jsonpath='{.metadata.annotations.trustyai\.opendatahub\.io/evaluation-status}' \
| jq .
{
"benchmark_index": 0,
"evaluation_id": "4f112656-6815-41cc-add4-ab2708197ddd",
"phase": "Completed",
"timestamp": "2026-08-06T22:53:16Z"
}

Label selector queries — filter or count evaluations by phase using any standard Kubernetes tooling, without an EvalHub API token:

Terminal window
kubectl get jobs -n <tenant-namespace> \
-l trustyai.opendatahub.io/evaluation-phase=Completed \
-L trustyai.opendatahub.io/evaluation-phase

Policy enforcement — Kyverno or OPA/Gatekeeper policies can gate on the phase label before admitting downstream resources that depend on a completed evaluation.

Alerting — route EvaluationFailed Warning events to Alertmanager or a webhook via the Kubernetes events API to receive immediate notification of failed evaluations.

Audit trail — combine the evaluation-status annotation timestamp with kubectl get events to reconstruct the full lifecycle timeline for a given benchmark.