Use this skill when the user wants to diagnose or root-cause issues with an OCI Kubernetes Engine cluster or workload. Trigger phrases include "pods pending", "troubleshoot OKE", "service has no IP", "cluster unhealthy", DPDK/SR-IOV mlx5 pod failures, Multus network-status issues, or broad incident RCA across Kubernetes and OCI resources. Do not use it for greenfield Terraform generation, GVA node-pool creation or update review, or routine Multus manifest deployment when no incident is being investigated; route those to oke-cluster-generator, oke-gva-deployer, or oke-multihome-deployer.
symptom-triage.md — initial mapping of symptom → diagnostic domains.evidence-collectors.md — command recipes for each domain.final-report-template.md — standard final report structure.../../shared/oci-resource-map.md — K8s-to-OCI mapping commands.../oke-multihome-deployer/references/oke-dpdk-mlx5-notes.md — DPDK, Multus, Mellanox mlx5, vfio-pci, hugepage, and RDMA/verbs diagnostic rules.../../agents/oke-evidence-collector.md — agent for command execution and evidence normalization.../../agents/oke-hypothesis-analyst.md — agent for scoring hypotheses.../../agents/oke-lb-log-collector.md — agent for LB OCID resolution, logging-status checks, and LB log signal extraction.../../scripts/oke-discover.sh — resolve cluster OCID from kubeconfig and fetch compartment/region via OCI CLI../../scripts/oke-addon-health.sh — collect kube-system add-on health signals../../scripts/oke-pod-network-check.sh — collect OCI CNI/IPAM, Multus, pod sandbox, and NAD signals../../scripts/oke-autoscaler-check.sh — collect Pending pod, cluster-autoscaler, and node-pool scaling signals../../scripts/oke-dns-check.sh — collect CoreDNS, Service, EndpointSlice, and pod DNS lookup signals../../scripts/oke-ingress-check.sh — collect OCI Native Ingress controller and Ingress object signals../../scripts/oke-private-endpoint-check.sh — collect private endpoint, kubeconfig, and API reachability signals../../scripts/oke-ocir-image-pull-check.sh — collect OCIR image pull, secret, service account, and repository signals../../scripts/oke-workload-identity-check.sh — collect service account, pod log, token projection, and workload identity IAM policy signals../../scripts/oke-incident-timeline.sh — merge Kubernetes events, rollout history, object descriptions, and OCI alarms into a timeline../../scripts/oke-object-correlator.sh — build a Kubernetes-to-OCI object graph for pods, nodes, services, ingress, PVCs, load balancers, instances, VNICs, volumes, and node poolsevidence-collectors.md.kubectl apply, kubectl patch, kubectl annotate, kubectl delete, kubectl rollout restart, kubectl scale, node cordon/drain/debug flows, OCI create/update/delete operations, and LB logging enablement as approval-required. Approval for one command does not approve follow-up mutations.$ARGUMENTS holds an optional symptom string. If empty, ask the user for a concise description (e.g., "pods stuck Pending in prod namespace").-n, namespace:) and resource names when present.kubectl config get-contexts
active_cluster_region from the active kube context (kubectl config view --minify, user exec args, or cluster metadata tied to the current context) and treat it as authoritative.~/.kube/config when possible.~/.oci/config only for auth/profile hints, not for region selection.[object Object]
--region <active_cluster_region> to discovery and all OCI CLI calls in later phases.cluster_ocid, compartment_ocid, region, kubernetes_version, and deployment namespace when available.active_cluster_region, flag the mismatch, keep active_cluster_region for all subsequent commands, and ask for confirmation only if the mismatch prevents resource resolution.name or ocid) as the only in-scope target for the entire session.kubectl context does not match the discovered cluster identity, stop and ask the user to switch context or provide the correct kubeconfig before continuing.--region/--profile), never by probing other clusters.15m, 1h, default 1h), impact level (prod/non-prod).kubectl version --client and oci --version.KUBECTL_AVAILABLE/OCI_AVAILABLE booleans. If a CLI is missing, inform the user that evidence will be partial and continue with available tools.{
"symptom": "...",
"namespace": "...",
"time_window": "1h",
"cluster_ocid": "...",
"compartment_ocid": "...",
"region": "...",
"domains": [],
"dependency_map": {
"entrypoint": "",
"hops": [],
"critical_path": [],
"latency_budget_ms": {}
},
"fallbacks": {"kubectl": false, "oci": false},
"evidence": [],
"node_doctor": {
"enabled": false,
"execution_mode": "ask_then_execute",
"image": "",
"targets": [],
"results": []
}
}
symptom-triage.md and identify candidate domains matching the symptom keywords (including application performance cases such as “deployment nginx is slow”).POD_NAME, SERVICE_NAME, DEPLOYMENT_NAME, LABEL_SELECTOR, BASELINE_LATENCY, DEPENDENCY_MAP).{
"entrypoint": "ingress/payments",
"hops": [
{"from": "ingress/payments", "to": "deployment/payments-api", "protocol": "HTTP"},
{"from": "deployment/payments-api", "to": "svc/orders", "protocol": "gRPC"},
{"from": "deployment/payments-api", "to": "svc/redis", "protocol": "TCP"}
],
"critical_path": ["ingress/payments->deployment/payments-api", "deployment/payments-api->svc/orders"],
"latency_budget_ms": {
"end_to_end_p99": 500,
"ingress/payments->deployment/payments-api": 120,
"deployment/payments-api->svc/orders": 220
}
}
[object Object]
domain, graph.kubernetes, graph.oci, graph.edges, findings, anomalies, raw_snippets, and fallback_used.fallback_used=true, continue with domain-specific collectors and call out which object links could not be resolved.evidence-collectors.md.{
"cmd": "kubectl describe pod trainer-0 -n ml-team",
"purpose": "Inspect scheduling events"
}
evidence-collectors.md locally and normalize the same output fields in the parent skill.namespace, service, region, compartment_ocid, time_window, and enable_logging_mode.logging_status=disabled|unknown:
No (report only)Yes (print command only)Yes (run now)enable_logging_mode and rerun collector if needed.lb_ocid, logging_status, logging_status_source, log_findings, anomalies, fallback_used[object Object]
[object Object]
[object Object]
[object Object]
[object Object]
[object Object]
[object Object]
[object Object]
[object Object]
domain, findings, anomalies, raw_snippets, and fallback_used.docker.io/library/ubuntu each run (kubectl debug ... --image=<image-name>), and allow user override. Keep the selected image in session for additional nodes unless user changes it.bash ../../scripts/node-doctor-run.sh --node <node-name> --image <image-name>kubectl debug + chroot /host + sudo /usr/local/bin/node-doctor.sh --check)Execute nowPrint commands onlySkipnode_doctor_attempted, node_doctor_executed, node_doctor_node, node_doctor_imagenode_doctor_result (pass | fail | unknown) and node_doctor_command_rcnode_doctor_findings, node_doctor_raw_snippet, node_doctor_fallback_reason{
"symptom": "...",
"domains": ["Pod Scheduling"],
"namespace": "...",
"time_window": "...",
"selectors": {"pod": "...", "service": "...", "deployment": "...", "label": "..."},
"dependency_map": {
"entrypoint": "...",
"hops": [],
"critical_path": [],
"latency_budget_ms": {}
},
"object_graph": {...},
"fallbacks": {"kubectl": false, "oci": true},
"compartment_ocid": "..."
}
oke-evidence-collector.domain, findings, raw_snippets, anomalies, fallback_used).fallback_used signals or missing data.{
"symptom": "...",
"domains": [...],
"dependency_map": {...},
"object_graph": {...},
"evidence": [...],
"fallbacks": {"kubectl": false, "oci": true}
}
oke-hypothesis-analyst.9-10: direct, converging evidence for one root cause6-8: strong multi-signal correlation with limited ambiguity3-5: plausible but missing a decisive signal1-2: weak signal or mostly evidence-gap guidancefinal-report-template.md and present a structured report using that shape:
High, Medium, Low based on score thresholds).hop, expected_p99_ms, observed_p99_ms, delta_ms, confidence.***.Use the OKE troubleshooter for pods stuck Pending in prod namespaceUse the OKE troubleshooter for lb service has no IP us-phoenix-1Use the OKE troubleshooter for cluster api timing outUse the OKE troubleshooter for customer is indicating poor performance for deploymentUse the OKE troubleshooter for CoreDNS timeouts in prodUse the OKE troubleshooter for cluster autoscaler is not adding nodesUse the OKE troubleshooter for pods fail sandbox creation with OCI CNI IPAM errorsUse the OKE troubleshooter for OCIR ImagePullBackOff unauthorized/oke-troubleshooter "workload identity pod gets NotAuthorized"/oke-troubleshooter "private OKE API endpoint unreachable"/oke-troubleshooter "OCI native ingress TLS backend errors""payments API p99 jumped from 350ms to 1.8s"prodpayments-api1h{
"entrypoint": "ingress/payments",
"hops": [
{"from": "ingress/payments", "to": "deployment/payments-api", "protocol": "HTTP"},
{"from": "deployment/payments-api", "to": "svc/orders", "protocol": "gRPC"},
{"from": "deployment/payments-api", "to": "svc/redis", "protocol": "TCP"}
],
"critical_path": [
"ingress/payments->deployment/payments-api",
"deployment/payments-api->svc/orders"
],
"latency_budget_ms": {
"end_to_end_p99": 500,
"ingress/payments->deployment/payments-api": 120,
"deployment/payments-api->svc/orders": 220,
"deployment/payments-api->svc/redis": 80
}
}
"Orders dependency latency spike is primary bottleneck"High when both sides of hop agree.| Hop | Expected p99 (ms) | Observed p99 (ms) | Delta (ms) | Confidence |
|---|---|---|---|---|
| ingress/payments->payments-api | 120 | 140 | +20 | Medium |
| payments-api->orders | 220 | 980 | +760 | High |
| payments-api->redis | 80 | 95 | +15 | Medium |
payments-api->orders first, then re-measure end-to-end p99.