סקיל systematic-debugging: דיבוג שיטתי בקלוד קוד
systematic-debugging הוא הסקיל של חבילת Superpowers שכופה על קלוד לעצור את המשיכה אל תיקונים מהירים ולחקור את הסיבה השורשית לפני שהוא נוגע בקוד. הסקיל מחלק את התהליך לארבעה שלבים ברורים, עם חוק ברזל: אסור להציע תיקון לפני שהסיבה הובהרה לעומק. עם כ-60 אלף התקנות שבועיות זה כלי קריטי למפתחים שעובדים עם קלוד על פרויקטים אמיתיים. בסקירה זו אבחן את התהליך, את היתרונות מול דיבוג מהיר רגיל, ומקרי שימוש אמיתיים.
פקודת התקנה
npx skills add https://github.com/obra/superpowers --skill systematic-debugging
קובץ הסקיל הוא Markdown פתוח. אפשר להוריד אותו ולהריץ בדיקת קוד לפני התקנה דרך הכפתורים שבראש העמוד.
מה הסקיל כולל?
הסקיל מטמיע בקלוד תהליך דיבוג בן ארבעה שלבים עם חוק ברזל: אסור לכתוב תיקון לפני שהסיבה השורשית מובנת. כל שלב חייב להסתיים לפני המעבר לבא.
קוד הסקיל המלא
---
name: systematic-debugging
description: Use when encountering any bug, test failure, or unexpected behavior, before proposing fixes
---
# Systematic Debugging
## Overview
Random fixes waste time and create new bugs. Quick patches mask underlying issues.
**Core principle:** ALWAYS find root cause before attempting fixes. Symptom fixes are failure.
**Violating the letter of this process is violating the spirit of debugging.**
## The Iron Law
```
NO FIXES WITHOUT ROOT CAUSE INVESTIGATION FIRST
```
If you haven't completed Phase 1, you cannot propose fixes.
## When to Use
Use for ANY technical issue:
- Test failures
- Bugs in production
- Unexpected behavior
- Performance problems
- Build failures
- Integration issues
**Use this ESPECIALLY when:**
- Under time pressure (emergencies make guessing tempting)
- "Just one quick fix" seems obvious
- You've already tried multiple fixes
- Previous fix didn't work
- You don't fully understand the issue
**Don't skip when:**
- Issue seems simple (simple bugs have root causes too)
- You're in a hurry (rushing guarantees rework)
- Manager wants it fixed NOW (systematic is faster than thrashing)
## The Four Phases
You MUST complete each phase before proceeding to the next.
### Phase 1: Root Cause Investigation
**BEFORE attempting ANY fix:**
1. **Read Error Messages Carefully**
- Don't skip past errors or warnings
- They often contain the exact solution
- Read stack traces completely
- Note line numbers, file paths, error codes
2. **Reproduce Consistently**
- Can you trigger it reliably?
- What are the exact steps?
- Does it happen every time?
- If not reproducible → gather more data, don't guess
3. **Check Recent Changes**
- What changed that could cause this?
- Git diff, recent commits
- New dependencies, config changes
- Environmental differences
4. **Gather Evidence in Multi-Component Systems**
**WHEN system has multiple components (CI → build → signing, API → service → database):**
**BEFORE proposing fixes, add diagnostic instrumentation:**
```
For EACH component boundary:
- Log what data enters component
- Log what data exits component
- Verify environment/config propagation
- Check state at each layer
Run once to gather evidence showing WHERE it breaks
THEN analyze evidence to identify failing component
THEN investigate that specific component
```
**Example (multi-layer system):**
```bash
# Layer 1: Workflow
echo "=== Secrets available in workflow: ==="
echo "IDENTITY: ${IDENTITY:+SET}${IDENTITY:-UNSET}"
# Layer 2: Build script
echo "=== Env vars in build script: ==="
env | grep IDENTITY || echo "IDENTITY not in environment"
# Layer 3: Signing script
echo "=== Keychain state: ==="
security list-keychains
security find-identity -v
# Layer 4: Actual signing
codesign --sign "$IDENTITY" --verbose=4 "$APP"
```
**This reveals:** Which layer fails (secrets → workflow ✓, workflow → build ✗)
5. **Trace Data Flow**
**WHEN error is deep in call stack:**
See `root-cause-tracing.md` in this directory for the complete backward tracing technique.
**Quick version:**
- Where does bad value originate?
- What called this with bad value?
- Keep tracing up until you find the source
- Fix at source, not at symptom
### Phase 2: Pattern Analysis
**Find the pattern before fixing:**
1. **Find Working Examples**
- Locate similar working code in same codebase
- What works that's similar to what's broken?
2. **Compare Against References**
- If implementing pattern, read reference implementation COMPLETELY
- Don't skim - read every line
- Understand the pattern fully before applying
3. **Identify Differences**
- What's different between working and broken?
- List every difference, however small
- Don't assume "that can't matter"
4. **Understand Dependencies**
- What other components does this need?
- What settings, config, environment?
- What assumptions does it make?
### Phase 3: Hypothesis and Testing
**Scientific method:**
1. **Form Single Hypothesis**
- State clearly: "I think X is the root cause because Y"
- Write it down
- Be specific, not vague
2. **Test Minimally**
- Make the SMALLEST possible change to test hypothesis
- One variable at a time
- Don't fix multiple things at once
3. **Verify Before Continuing**
- Did it work? Yes → Phase 4
- Didn't work? Form NEW hypothesis
- DON'T add more fixes on top
4. **When You Don't Know**
- Say "I don't understand X"
- Don't pretend to know
- Ask for help
- Research more
### Phase 4: Implementation
**Fix the root cause, not the symptom:**
1. **Create Failing Test Case**
- Simplest possible reproduction
- Automated test if possible
- One-off test script if no framework
- MUST have before fixing
- Use the `superpowers:test-driven-development` skill for writing proper failing tests
2. **Implement Single Fix**
- Address the root cause identified
- ONE change at a time
- No "while I'm here" improvements
- No bundled refactoring
3. **Verify Fix**
- Test passes now?
- No other tests broken?
- Issue actually resolved?
4. **If Fix Doesn't Work**
- STOP
- Count: How many fixes have you tried?
- If < 3: Return to Phase 1, re-analyze with new information
- **If ≥ 3: STOP and question the architecture (step 5 below)**
- DON'T attempt Fix #4 without architectural discussion
5. **If 3+ Fixes Failed: Question Architecture**
**Pattern indicating architectural problem:**
- Each fix reveals new shared state/coupling/problem in different place
- Fixes require "massive refactoring" to implement
- Each fix creates new symptoms elsewhere
**STOP and question fundamentals:**
- Is this pattern fundamentally sound?
- Are we "sticking with it through sheer inertia"?
- Should we refactor architecture vs. continue fixing symptoms?
**Discuss with your human partner before attempting more fixes**
This is NOT a failed hypothesis - this is a wrong architecture.
## Red Flags - STOP and Follow Process
If you catch yourself thinking:
- "Quick fix for now, investigate later"
- "Just try changing X and see if it works"
- "Add multiple changes, run tests"
- "Skip the test, I'll manually verify"
- "It's probably X, let me fix that"
- "I don't fully understand but this might work"
- "Pattern says X but I'll adapt it differently"
- "Here are the main problems: [lists fixes without investigation]"
- Proposing solutions before tracing data flow
- **"One more fix attempt" (when already tried 2+)**
- **Each fix reveals new problem in different place**
**ALL of these mean: STOP. Return to Phase 1.**
**If 3+ fixes failed:** Question the architecture (see Phase 4.5)
## your human partner's Signals You're Doing It Wrong
**Watch for these redirections:**
- "Is that not happening?" - You assumed without verifying
- "Will it show us...?" - You should have added evidence gathering
- "Stop guessing" - You're proposing fixes without understanding
- "Ultrathink this" - Question fundamentals, not just symptoms
- "We're stuck?" (frustrated) - Your approach isn't working
**When you see these:** STOP. Return to Phase 1.
## Common Rationalizations
| Excuse | Reality |
|--------|---------|
| "Issue is simple, don't need process" | Simple issues have root causes too. Process is fast for simple bugs. |
| "Emergency, no time for process" | Systematic debugging is FASTER than guess-and-check thrashing. |
| "Just try this first, then investigate" | First fix sets the pattern. Do it right from the start. |
| "I'll write test after confirming fix works" | Untested fixes don't stick. Test first proves it. |
| "Multiple fixes at once saves time" | Can't isolate what worked. Causes new bugs. |
| "Reference too long, I'll adapt the pattern" | Partial understanding guarantees bugs. Read it completely. |
| "I see the problem, let me fix it" | Seeing symptoms ≠ understanding root cause. |
| "One more fix attempt" (after 2+ failures) | 3+ failures = architectural problem. Question pattern, don't fix again. |
## Quick Reference
| Phase | Key Activities | Success Criteria |
|-------|---------------|------------------|
| **1. Root Cause** | Read errors, reproduce, check changes, gather evidence | Understand WHAT and WHY |
| **2. Pattern** | Find working examples, compare | Identify differences |
| **3. Hypothesis** | Form theory, test minimally | Confirmed or new hypothesis |
| **4. Implementation** | Create test, fix, verify | Bug resolved, tests pass |
## When Process Reveals "No Root Cause"
If systematic investigation reveals issue is truly environmental, timing-dependent, or external:
1. You've completed the process
2. Document what you investigated
3. Implement appropriate handling (retry, timeout, error message)
4. Add monitoring/logging for future investigation
**But:** 95% of "no root cause" cases are incomplete investigation.
## Supporting Techniques
These techniques are part of systematic debugging and available in this directory:
- **`root-cause-tracing.md`** - Trace bugs backward through call stack to find original trigger
- **`defense-in-depth.md`** - Add validation at multiple layers after finding root cause
- **`condition-based-waiting.md`** - Replace arbitrary timeouts with condition polling
**Related skills:**
- **superpowers:test-driven-development** - For creating failing test case (Phase 4, Step 1)
- **superpowers:verification-before-completion** - Verify fix worked before claiming success
## Real-World Impact
From debugging sessions:
- Systematic approach: 15-30 minutes to fix
- Random fixes approach: 2-3 hours of thrashing
- First-time fix rate: 95% vs 40%
- New bugs introduced: Near zero vs common
מה זה סקיל systematic-debugging ולמה הוא חשוב?
systematic-debugging הוא סקיל מרכזי בחבילת Superpowers של jesse noller (obra). הוא פותר בעיה קריטית בעבודה עם AI על קוד: הנטייה לקפוץ לתיקונים מהירים לפני הבנת הסיבה השורשית של הבאג.
הבעיה מוכרת לכל מפתח שעבד עם AI על דיבוג. AI רואה שגיאה, מנחש את הסיבה, ומציע תיקון. לעיתים התיקון עובד, אבל לעיתים הוא פותר תסמין ולא סיבה. הבאג חוזר מצד אחר, לפעמים בצורה חמורה יותר. הסקיל הזה מונע את זה על ידי כפיית תהליך שיטתי.
התהליך בנוי מארבעה שלבים. שלב 1: חקירת סיבה שורשית, כולל קריאה זהירה של שגיאות, שחזור עקבי של הבעיה, ובדיקת שינויים אחרונים. שלב 2: בניית hypothesis על הסיבה. שלב 3: תיקון ממוקד רק אחרי שה-hypothesis אומת. שלב 4: אימות שהתיקון פתר את הבעיה ולא יצר תופעות לוואי. חוק הברזל של הסקיל הוא שלא לכתוב שורת תיקון אחת לפני ששלב 1 הסתיים.
הסקיל הזה משתלב מעולה עם פיתוח של מערכות מקצועיות שיכולות לעלות במקרה של באג קריטי, ועם אוטומציות עסקיות שהלקוח מצפה שירוצו ללא תקלה. במקום לעבור מבאג לבאג תוך כדי שעיה על "לא לשבור עוד דברים", יש תהליך שמבטיח שכל באג נפתר פעם אחת נכון.
מה סקיל systematic-debugging נותן לקלוד קוד?
הסקיל מטמיע בקלוד את דפוסי החשיבה של מפתח ותיק בדיבוג. כל אחת מהיכולות הבאות נאכפת אוטומטית בכל פעם שקלוד מתבקש לטפל בבאג.
חוק הברזל: אין תיקון בלי חקירה
הסקיל מגדיר חוק ברזל: לא לכתוב שורת תיקון אחת עד ששלב חקירת הסיבה השורשית הסתיים. זה מונע מקלוד לנחש ולפתור סימפטומים במקום את הבעיה האמיתית, דפוס שגורם לבאגים לחזור מנקודה אחרת.
שחזור עקבי של הבעיה
הסקיל דורש שהבעיה תושחזר באופן עקבי לפני שמנסים לתקן. אם אי אפשר לשחזר, אוספים עוד נתונים ולא מנחשים. זה מונע מצבים של כביכול תוקן שבהם הבעיה עדיין קיימת בחלק מהמצבים.
בדיקה מול git log ושינויים
הסקיל מחייב לבדוק אילו שינויים נעשו בקוד סמוך להופעת הבעיה. לעיתים הבעיה החלה מקומיט מסוים, ואפשר לאתר מיד את הקוד שגרם לה. בלי המשמעת הזאת, קלוד נוטה לחפש פתרונות במקומות אחרים.
אימות שהתיקון באמת פתר
אחרי התיקון, הסקיל דורש אימות מפורש שהבאג נעלם, ושלא נוצרו תופעות לוואי חדשות. הרצה חוזרת של הצעד ששחזר את הבעיה, בדיקת בדיקות קיימות, ולעיתים הוספת בדיקה חדשה שתמנע את הבעיה בעתיד.
בלי הסקיל, קלוד נוטה לפתרונות מהירים שמטפלים בתסמינים. עם הסקיל, הבאג נפתר מהשורש ולא חוזר מנקודה אחרת.
למי הסקיל הזה מתאים?
מפתחי תוכנה שעובדים על פרויקטים בייצור: כל מי שמתחזק קוד שרץ בייצור חייב את הסקיל הזה. ההבדל בין טיפול נקודתי לטיפול שורשי יכול להיות הבדל של ימים לעומת דקות בפגיעה במערכת.
צוותי QA וצוותי תמיכה טכנית: מי שמקבל דיווחים על באגים ונדרש לחקור אותם. הסקיל נותן שפה אחידה של חקירה, שעוזרת לתקשר עם צוות הפיתוח על מה נמצא ומה נשאר לא ברור. בשילוב עם סקיל webapp-testing לשחזור אוטומטי של באגים יש תשתית דיבוג מלאה.
Lead developers וראשי צוות: ראשי צוות שרוצים תרבות פנימית של דיבוג מקצועי. הסקיל עוזר לחברי צוות פחות מנוסים לעבוד בשיטתיות, ולהעביר את הידע של הבכירים בצורה סטנדרטית. קלוד קוד עם הסקיל הזה הופך לעוזר דיבוג קבוע בצוות.
סוכנויות פיתוח שמטפלות בקוד legacy של לקוחות: קוד ישן נוטה לבאגים נסתרים שפתרון שלהם דורש הבנה עמוקה של ההיסטוריה. הסקיל מאפשר לטפל ב-legacy בצורה שיטתית במקום לנחש. פלאגין Superpowers מאפשר לטעון את הסקיל יחד עם סקילי תכנון לסביבת עבודה שלמה.
מי שלא מתאים: משימות שלא קשורות לבאגים. לפיצ׳רים חדשים הסקיל brainstorming מתאים יותר. לעבודות שגרתיות של refactoring בלי בעיה ספציפית, הסקיל יוסיף overhead מיותר. הוא נועד לבאגים ולא לפיתוח רגיל.
איך סקיל systematic-debugging עזר לי בפרויקטים אמיתיים
איתור באג production שהופיע לאחר שדרוג ספרייה
שרת production של לקוח התחיל להחזיר שגיאות 500 אחרי שדרוג. הסקיל הנחה לבדוק את git log של השדרוג, לאתר את השינוי הספציפי, ולשחזר אותו בסביבת staging. תוך שעה הגדרנו את הבאג ותיקנו נקודתית, במקום לזחור את השדרוג כולו.
תיקון בדיקות שעוברות באופן לא עקבי
פרויקט עם בדיקות שעוברות לפעמים ונכשלות לפעמים (flaky tests). הסקיל הנחה לחפש מקורות של chaos: race conditions, תלויות זמן, סדר ריצה. מצאנו שתי race conditions שהיו מוסתרות תחת timeout גדול. עכשיו הבדיקות יציבות.
דיבוג של בעיית ביצועים בשאילתה ל-DB
אפליקציה קיבלה timeouts על שאילתה שפעלה קודם בסדר. הסקיל חקר: בדק את תוכנית הביצוע, השווה בין הגרסה הישנה לחדשה, ומצא שאינדקס נמחק בטעות. לא תיקנו עם hint לאופטימייזר, אלא החזרנו את האינדקס ותעדנו את הסיבה.
שגיאת integration בין שני שירותים
שני microservices החלו להחזיר שגיאות זה לזה ללא שינוי קוד ברור. הסקיל הנחה לבדוק deployment logs וחילוף headers. מצאנו ש-load balancer החל לסנן header מסוים בעקבות עדכון של TLS. התיקון היה ברמת התשתית, לא באפליקציה.
ארבעת המקרים האלה ממחישים שהסקיל מתאים לסוגי בעיות שונים: באגי production אחרי שידרוג, flaky tests, בעיות ביצועים, ובאגי אינטגרציה. בכל פרויקט, החקירה השיטתית הובילה לפתרון יציב בפעם הראשונה, במקום סבבי תיקון שלא פותרים את הבעיה.
סיכום
systematic-debugging הוא סקיל קריטי לכל מי שעובד עם קוד בייצור. הוא מונע את אחד הדפוסים המסוכנים ביותר של AI: תיקונים מהירים שלא פותרים את הסיבה ומחזירים את הבאג בצורה חמורה יותר מאוחר.
אם אתם מתחילים, הריצו את פקודת ההתקנה, ובפעם הבאה שתיתקלו בבאג, ראו איך קלוד עוצר ומתחיל לחקור במקום להציע פתרון. בהתחלה זה מרגיש איטי, אחרי באג אחד שנפתר מהשורש ולא חוזר, זה מרגיש נכון. אפשר גם להוריד את קובץ הסקיל המלא ולקרוא אותו לפני התקנה.
בסקירה הבאה אבחן את סקיל writing-plans שמשלים את השלישייה של Superpowers: תכנון, דיבוג וכתיבת תכניות עבודה. לצוותים שמתחזקים מערכות בייצור, החבילה הזאת חוסכת שעות רבות של תיקונים חוזרים.
שיתוף הסקיל
שאלות ותשובות
האם הסקיל לא מאט את העבודה?
בטווח הקצר קצת, בטווח הבינוני מאיץ משמעותית. תיקונים מהירים שלא פותרים את הבעיה חוזרים, לעיתים אפילו חמורים יותר. השיטתיות חוסכת את הסבבים האלה. לפרויקטים רציניים, הסקיל יכול לחסוך ימי עבודה בלבד לאורך חודש.
מה ההבדל בינו לבין דיבוג רגיל של מפתח מנוסה?
מפתח מנוסה משתמש באותו שיטתיות אינסטינקטיבית. הסקיל עושה את זה מפורש ומכריח את קלוד לעקוב אחרי אותו תהליך. התוצאה היא שגם מפתח פחות מנוסה שעובד עם קלוד יקבל איכות של מפתח ותיק. זה מאוד שימושי לצוותים מעורבים.
האם הסקיל עובד גם על באגי תשתית ולא רק על קוד?
כן, חד משמעית. הסקיל עבד מעולה על באגים של רשת, DNS, TLS, load balancing. השיטתיות של חקר הסיבה השורשית תופסת עבור כל סוג בעיה טכנית. לעיתים הסיבה אפילו בתחום אחר מהתחום שזיהינו בהתחלה.
כמה זמן לוקח תהליך של systematic-debugging?
תלוי במורכבות. באג פשוט עם סיבה גלויה נגמר תוך 15 דקות. באג מורכב עם סיבה מוחבאת יכול להימשך שעות. אבל היתרון הוא שאחרי התהליך, יש ודאות שהבאג נפתר באמת, לא רק כביכול.
האם מתאים לצוות שעובד עם הרבה באגים?
כן, אפילו יותר מצוות שרואה באגים נדירים. צוות עם זרם קבוע של באגים נוטה לפתרונות מהירים שמצטברים לחוב טכני. הסקיל הזה עוזר למנוע את המעגל: כל באג נפתר פעם אחת עם הבנה, ולא חוזר בצורה אחרת.
מה לגבי באגים שמופיעים רק אצל משתמש ספציפי?
הסקיל מדגיש שחזור כ-requirement, וזה מאתגר בבעיות ספציפיות. במקרים כאלה הסקיל מנחה לאסוף לוגים מהסביבה של המשתמש, לבקש פרטים מדויקים על הסביבה, ולנסות לשחזר במכונה זהה. לעיתים הסיבה היא הבדל סביבה שלא היה מזוהה קודם.
האם הסקיל דורש שימוש בכלי דיבוג ספציפי?
לא. הסקיל אגנוסטי לכלים. הוא עובד עם debugger של IDE, עם logging פשוט, עם tracing מתקדם, או עם מה שיש לכם. הוא מגדיר תהליך של חשיבה, לא כלי. אפשר לשלב אותו עם כל סטק פיתוח.
איך זה משתלב עם brainstorming ו-writing-plans?
systematic-debugging מתמקד באיתור באגים בקוד קיים. brainstorming עוזר לתכנן פיצ׳ר חדש. writing-plans יוצר תוכנית עבודה לפיצ׳רים גדולים. שלושתם ביחד נותנים לקלוד את המערכת המלאה של מחשבה מקצועית: תכנון, מימוש, ותיקון.