$npx -y skills add tkellogg/open-strix --skill five-whysStructured root cause analysis for arriving at a concrete action. Use when something went wrong, a pattern keeps recurring, behavior has drifted, or you catch yourself resolving to "do better" / "remember to X" without a concrete artifact. Five-whys forces behavioral resolutions
| 1 | # Five Whys |
| 2 | |
| 3 | Five Whys is a method for finding root causes. You ask "why did this happen?" and |
| 4 | answer it honestly. Then you ask "why?" about that answer. You keep going until you |
| 5 | hit bedrock — the structural cause that, if changed, would prevent the problem from |
| 6 | recurring. |
| 7 | |
| 8 | The goal is **understanding**, not blame. You're investigating a system (which |
| 9 | includes yourself). Systems have structural properties that produce outcomes. Find |
| 10 | the structural property, change it, and the outcome changes. |
| 11 | |
| 12 | ## When to Use This |
| 13 | |
| 14 | - Something failed or went wrong and the surface-level explanation feels incomplete |
| 15 | - A pattern keeps recurring despite previous fixes |
| 16 | - You're about to make a change and want to make sure you're fixing the right thing |
| 17 | - Behavior (yours or a system's) has drifted from expectations |
| 18 | - Someone asks "why does this keep happening?" |
| 19 | |
| 20 | ## When NOT to Use This |
| 21 | |
| 22 | - The cause is obvious and singular (typo, wrong config value, missing file) |
| 23 | - You're troubleshooting a known bug with a known fix |
| 24 | - The problem is "how do I do X?" not "why did X go wrong?" |
| 25 | |
| 26 | ## The Process |
| 27 | |
| 28 | ### Step 1: State the Problem |
| 29 | |
| 30 | Write down what happened. Be specific. Not "it broke" but "the classifier produced |
| 31 | 11 consecutive errors between iterations 83-93, spending 57 minutes with zero |
| 32 | successful runs." |
| 33 | |
| 34 | The problem statement is the root of your tree. |
| 35 | |
| 36 | ### Step 2: Ask Why — And Answer It |
| 37 | |
| 38 | For the problem (or any node in the tree), ask: **"Why did this happen?"** |
| 39 | |
| 40 | Then answer it. Both the question and the answer matter equally. A question without |
| 41 | an answer is incomplete. An answer without a clear question is unanchored. |
| 42 | |
| 43 | ``` |
| 44 | PROBLEM: 11 consecutive classifier errors, 57 min wasted |
| 45 | WHY: The proposer suggested CatBoost, which isn't in the allowed algorithm list |
| 46 | ANSWER: The proposer has no documentation of which algorithms are available |
| 47 | ``` |
| 48 | |
| 49 | **Rules for good answers:** |
| 50 | - An answer must be **factual and verifiable**. Check logs, read code, look at data. |
| 51 | Don't speculate — investigate. |
| 52 | - If you can't verify an answer, say so. "I believe X but haven't confirmed" is |
| 53 | honest. "X" stated as fact when you haven't checked is not. |
| 54 | - An answer should be a **mechanism**, not a redescription. "It failed because it |
| 55 | was broken" is circular, not explanatory. |
| 56 | |
| 57 | ### Step 3: Go Deeper — Recursively |
| 58 | |
| 59 | Take each answer and ask "why?" again. Keep going until you reach one of: |
| 60 | |
| 61 | - **A structural property of the system** that can be changed (a missing |
| 62 | constraint, a bad default, an absent check) |
| 63 | - **An external boundary** you don't control (a vendor API, a hardware limit, a |
| 64 | policy) |
| 65 | - **A known and accepted tradeoff** that was made intentionally |
| 66 | |
| 67 | That's bedrock. Stop there. |
| 68 | |
| 69 | **How to know you've hit bedrock:** If you ask "why?" one more time and the answer |
| 70 | is either "that's how the universe works" or "because we chose to" — you're there. |
| 71 | |
| 72 | **How to know you haven't:** If you can still point to a structural property that |
| 73 | someone could change — keep going. |
| 74 | |
| 75 | ### Step 4: The Tree Is Fractal |
| 76 | |
| 77 | This is critical. At any single level, the answer to "why?" often has **two or |
| 78 | three independent causes**. That's not a problem — it's *better*. Branch the tree. |
| 79 | |
| 80 | ``` |
| 81 | PROBLEM: Agent was unresponsive for 62 minutes |
| 82 | │ |
| 83 | ├─ WHY-1: The LLM API call hung and never returned |
| 84 | │ └─ WHY: No turn-level timeout exists in the harness |
| 85 | │ └─ WHY: The harness assumes LLM calls always complete |
| 86 | │ → BEDROCK: Missing timeout (structural — fixable) |
| 87 | │ |
| 88 | ├─ WHY-2: Agent was already degraded from sync sleep-polling |
| 89 | │ └─ WHY: Agent doesn't trust the async callback mechanism |
| 90 | │ └─ WHY: Past flaky experiences created a hedging pattern |
| 91 | │ └─ WHY: No positive evidence of reliability in memory |
| 92 | │ → BEDROCK: Missing trust documentation (structural — fixable) |
| 93 | │ |
| 94 | └─ WHY-3: The LLM endpoint was unstable all day |
| 95 | └─ WHY: Another team member deleted the deployment |
| 96 | → BEDROCK: Shared resource, no access control (external boundary) |
| 97 | ``` |
| 98 | |
| 99 | Multiple root causes are the norm, not the exception. Most problems are |
| 100 | **overdetermined** — several things conspired. Finding all of them matters because |
| 101 | fixing only one may not prevent recurrence. |
| 102 | |
| 103 | Don't force your tree into a single chain. If you find yourself writing "and also" |
| 104 | — that's a second branch, not a conjunction. |
| 105 | |
| 106 | ### Step 5: Action Items |
| 107 | |
| 108 | Every bedrock node should produce an action item. Here's what separates useful |
| 109 | actions from theater: |
| 110 | |
| 111 | **An action item must produce a concrete artifact.** It must result in a file edit, |
| 112 | a config change |