Troubleshoot an agent that isn't Ready¶
This guide walks you from kubectl get hermesagent to a likely root cause, keyed on status.phase. For a flat symptom-keyed reference, see Reference: Troubleshooting catalogue.
Step 1: read the phase¶
The PHASE column tells you which subsection below to read.
| Phase | What it means | Jump to |
|---|---|---|
Bootstrap |
The operator refuses to create the Pod yet. | Bootstrap |
Provisioning |
Pod is being created or hasn't reached readiness yet. | Provisioning |
Ready |
The agent is healthy. Verify with Verify a HermesAgent is healthy. | — |
Degraded |
Something is wrong at runtime. | Degraded |
Bootstrap¶
Today this means a secretKeyRef or envFrom.secretRef in your spec did not resolve.
If the message says a Secret or key is missing, create it (or fix the reference) and the operator re-reconciles within ~15s.
Common causes:
- The Secret is in a different namespace than the HermesAgent. Secret references are namespace-local; the Secret must live alongside the CR.
- A typo in
secretKeyRef.nameorsecretKeyRef.key. Both must match exactly. - The Secret was created after the HermesAgent and the operator hasn't re-reconciled yet. Wait ~15s or
kubectl annotate hermesagent my-agent kick=now --overwriteto nudge it.
Provisioning¶
The CR's gates passed but the Pod is not ready yet. Look at the Pod.
kubectl -n hermes get pod -l app.kubernetes.io/instance=my-agent
kubectl -n hermes describe pod -l app.kubernetes.io/instance=my-agent
If the Pod is missing entirely, the operator may have hit a reconcile error. Check operator logs:
If the Pod is Pending, it's a scheduling issue (Insufficient cpu, node(s) had volume node affinity conflict, etc.). Check kubectl describe pod's Events section.
If the Pod is Running but READY 0/1, the readiness probe is failing. Tail the agent container's logs:
Common patterns:
| Log substring | Likely cause | See |
|---|---|---|
discord.errors.PrivilegedIntentsRequired |
MESSAGE CONTENT INTENT not enabled. | Set up a Discord bot |
HTTP 400 ... but you passed anthropic/claude-opus-4.6 |
config.yaml model default does not match active provider. |
Change the LLM provider for an agent |
Gateway already running (PID ...) |
A previous pod did not release the gateway.lock flock. |
Check Deployment is replicas: 1, strategy: Recreate. |
PermissionError: ... /opt/data |
Container UID does not match PVC ownership. | File an issue with the pod spec. |
Cannot connect to ... :443 |
Egress blocked. | Check NetworkPolicy egress rules, cluster egress firewall. |
Degraded¶
Something is wrong at runtime. Check the conditions to narrow down.
| Condition False | Meaning | Fix |
|---|---|---|
PodReady=False |
The agent Pod's PodReady is False; usually the readiness probe is failing. |
Check agent container logs as in Provisioning. |
RBACSynced=False with reason=ClusterRoleNotAllowed |
A spec.rbac.clusterRoleBindings[] entry references a role outside the install-time allowlist. |
Either remove the entry, or helm upgrade --set operator.allowedClusterRoles=... and restart the operator. See The RBAC model. |
GatewaysReady=False |
The dashboard sidecar reports at least one gateway as not connected. | Check status.gateways[] for the platform and message; see Reference: Troubleshooting catalogue. |
If Phase=Degraded but every condition is True, the agent is reporting gateway_state == degraded via the dashboard's /api/status. Port-forward to the dashboard and check the raw status:
kubectl -n hermes port-forward svc/hermes-my-agent-dashboard 9119:9119
curl -s http://localhost:9119/api/status | jq
When all else fails¶
- Reference: Troubleshooting catalogue — flat symptom-to-fix table.
- Known Hermes upstream behaviours — the things about upstream that surprise operator users.
- File an issue — include
kubectl version, operator version, the CR (with credentials redacted), and operator logs.