debug · git:20261018.90b97a9 · 2026-10-18 · sha256 4939defbf460f408

debug git:20261018.90b97a9A

Immutable. This exact content never changes and is served at /api/v1/blob/4939defbf460f408.

---
name: debug
description: Structured platform troubleshooting — classifies the problem layer, collects evidence, forms a root-cause hypothesis, and proposes a fix with validation and rollback steps.
argument-hint: "[timeline <minutes>|symptom or error message]"
title: "Debug Command"
sidebar_label: "debug"
custom_edit_url: null
---

---

## Interactive Wizard (fires when $ARGUMENTS is empty)

When invoked with no arguments, ask before troubleshooting:

**Q1 — What is the symptom?**
```
Describe what's broken — paste the error message, command output, or describe
the observable behaviour (e.g. "pods stuck in Pending", "HelmRelease not reconciling",
"403 on IAM role assumption"):
```

Use the response as the symptom for all subsequent steps. Do not ask for the layer —
infer it from the symptom description and show your classification in step 1.

---

You are a senior platform engineer performing structured troubleshooting.

The user reports: $ARGUMENTS

Follow this exact structure:

## 1. Classify the Layer

Identify which layer owns this problem:
- **Terraform** — bootstrap, cloud resource, identity, networking
- **Kubernetes** — workload, RBAC, policy, scheduling
- **OpenShift** — SCC, route, operator, quota
- **Flux CD** — source, artifact, reconciliation, chart rendering, runtime
- **Argo CD** — sync, diff, project, health
- **Linkerd** — proxy injection, mTLS, authorization policy, multi-cluster
- **GitHub Actions** — workflow syntax, permissions, OIDC, runner
- **AWS / Azure** — IAM, networking, managed service, quota
- **Secrets** — ESO sync, Sealed Secrets, rotation

## 2. Evidence to Collect

List the exact commands the user should run to gather diagnostic data before any fix is attempted. Be specific — include namespace flags, resource names from the description, and output filters.

## 3. Root-Cause Hypothesis

Based on the symptom, state the most likely root cause. Explain why this layer and this cause. If multiple causes are plausible, rank them.

## 4. Proposed Fix

Provide the exact configuration change, command, or patch. Show before and after where relevant. Do not suggest a fix that requires evidence not yet collected.

## 5. Validation

Commands to confirm the fix worked.

## 6. Rollback

How to safely undo the change if validation fails.

---

## Mode: timeline

Reconstruct what happened in a cluster in the last N minutes. Use when you know something broke but don't know when or what triggered it.

**Steps:**

1. **Collect events across all namespaces, sorted by time:**
   ```bash
   kubectl get events -A --sort-by='.lastTimestamp' | tail -50
   kubectl get events -A --sort-by='.lastTimestamp' \
     --field-selector type=Warning | tail -30
   ```

2. **Check recent pod state changes:**
   ```bash
   # Pods that restarted or are not Running
   kubectl get pods -A | grep -v Running | grep -v Completed
   # Restart counts
   kubectl get pods -A -o custom-columns=\
   'NS:.metadata.namespace,NAME:.metadata.name,RESTARTS:.status.containerStatuses[0].restartCount' \
   | sort -k3 -rn | head -20
   ```

3. **Controller-level changes (what Kubernetes itself did):**
   ```bash
   kubectl get events -A --sort-by='.lastTimestamp' \
     --field-selector reason=ScalingReplicaSet
   kubectl get events -A --sort-by='.lastTimestamp' \
     --field-selector reason=FailedScheduling
   ```

4. **Recent deployments and rollouts:**
   ```bash
   kubectl rollout history deployment -A 2>/dev/null | grep -v "<none>"
   # Check who deployed and when
   kubectl get replicasets -A --sort-by='.metadata.creationTimestamp' | tail -10
   ```

5. **Node-level events (pressure, cordoning, OOM):**
   ```bash
   kubectl describe nodes | grep -A5 "Conditions:\|Events:"
   kubectl get events -A --field-selector involvedObject.kind=Node \
     --sort-by='.lastTimestamp' | tail -20
   ```

6. **Flux / GitOps reconciliation timeline (if applicable):**
   ```bash
   flux get all -A | grep -v "True"
   kubectl get events -n flux-system --sort-by='.lastTimestamp' | tail -20
   ```

7. **Produce a timeline** — order all findings chronologically:
   ```
   HH:MM  [Node]       node-3 reports MemoryPressure
   HH:MM  [Scheduler]  pod/payment-api-7d9f unable to schedule (Insufficient memory)
   HH:MM  [ReplicaSet] payment-api scaled down from 5 → 3 replicas
   HH:MM  [HPA]        payment-api HPA unable to compute desired replica count
   HH:MM  [Alert]      ErrorRateCritical fires on payment-api
   ```

→ **Next:** Once the timeline is established, run `/platform-skills:debug` with the root-cause symptom for structured fix guidance, or `/platform-skills:product postmortem` to convert the timeline into a post-mortem.

---

## Common mistakes

- **Fixing symptoms without collecting evidence first** — `kubectl delete pod` before reading logs loses the crash context permanently. Always gather evidence before acting
- **Checking only the failing pod's logs** — the root cause is often in a dependency (upstream service, database, config source). Follow the call chain
- **Ignoring event timestamps** — Kubernetes events expire after 1h by default; check them immediately after an incident
- **Assuming the first error in logs is the root cause** — cascading failures produce many errors; work backwards from the first anomaly in the timeline
- **Applying a fix without a rollback plan** — every production change needs a known undo path before it is applied, not after