git:20260825.661af2b to git:20260907.ebb8c27

4 added, 4 removed. Audit A to A.

---
name: principle-fix-root-causes
description: "Apply when debugging. Trace each symptom to its root cause and fix it there; reproduce first, ask why until you reach it, resist nil-check guards that silence crashes."
user-invocable: false
---
# Fix Root Causes
- When debugging, do not paper over symptoms. Trace every problem to its root cause and fix it there.
+ When debugging, do not fix symptoms. Trace every problem to its root cause and fix it there.
**Why:** Symptom fixes accumulate. Each workaround makes the system harder to reason about, and the real bug remains. Root-cause fixes are slower upfront but reduce total debugging time.
**Pattern:**
- - Reproduce first (if you can't reproduce it, you can't verify your fix)
+ - Reproduce first
- Ask "why" until you hit the root cause
- - Resist the urge to add guards (adding a nil check to silence a crash is a symptom fix)
+ - Do not add guards (adding a nil check to silence a crash is a symptom fix)
- If a workaround needs a paragraph-long comment to justify it, the code is wrong (fix the code, not the comment)
- Check for the pattern, not just the instance (grep for the same pattern, fix all instances)
- When stuck, instrument. Don't guess (add logging, read the actual error)
**Restart bugs: suspect state before code**
- Code doesn't change between runs. State does. When something "fails after restart," suspect stale persistent state first: config files, caches, lock files, serialized state. If clearing a state file restores behavior, prioritize state validation as the fix.
+ When something "fails after restart," suspect stale persistent state first: config files, caches, lock files, serialized state. If clearing a state file restores behavior, prioritize state validation as the fix.