# Debug Phase

> Standard Operating Procedure for /debug phase. Covers error investigation, root cause analysis, systematic debugging, and error documentation.

- Skill: `majiayu000/debug-phase-2` (Agent Skill, multi-file: 2 files)
- Install (CLI): `npx skillmds add majiayu000/debug-phase-2`
- Raw SKILL.md: https://api.skillmd.com/api/skills/majiayu000/debug-phase-2/raw
- Safety review: pending
- Works with: Claude Code, Claude.ai, OpenAI Codex
- Category: Docs & Writing
- Author: majiayu000 (https://skillmd.com/u/majiayu000)
- Updated: 2026-09-09
- Page: https://skillmd.com/skills/majiayu000/debug-phase-2

---


# Debug Phase: Standard Operating Procedure

> **Training Guide**: Step-by-step procedures for executing the `/debug` command with systematic error investigation and documentation.

**Supporting references**:
- [reference.md](reference.md) - Error classification matrix, debugging workflow, logging best practices
- [examples.md](examples.md) - Good debugging (systematic, documented) vs bad (trial-and-error)
- [scripts/error-classifier.sh](scripts/error-classifier.sh) - Classifies errors by type and severity

---

## Phase Overview

**Purpose**: Systematically investigate errors, identify root causes, implement fixes, and document findings to prevent recurrence.

**Inputs**:
- Error reports (logs, stack traces, user reports)
- `error-log.md` (if exists) - Historical error records

**Outputs**:
- `error-log.md` - Updated with new error entry (ERR-XXXX)
- Fix implementation (code changes)
- Test cases to prevent recurrence
- Updated `workflow-state.yaml`

**Expected duration**: 30 minutes - 4 hours (depends on error complexity)

---

## Prerequisites

**Environment checks**:
- [ ] Error can be reproduced
- [ ] Logs available (application logs, error logs, stack traces)
- [ ] Development environment set up

**Knowledge requirements**:
- Debugging techniques (binary search, logging, breakpoints)
- Error classification (syntax, runtime, logic, integration)
- Root cause analysis (5 Whys, fishbone diagram)

---

## Execution Steps

### Step 1: Search for Similar Errors

**Actions**:
1. Check if `error-log.md` exists and search for similar errors:
   ```bash
   # Search by error message
   grep -i "connection timeout" error-log.md

   # Search by component
   grep "Component: StudentProgressService" error-log.md

   # Search by error type
   grep "Type: Integration" error-log.md
   ```

2. If similar error found:
   - Review previous fix (was it a workaround or root cause fix?)
   - Check if error recurred (implement permanent fix this time)
   - Note patterns (same component? same conditions?)

**Quality check**: If recurring error (>2 occurrences), prioritize permanent fix over workaround.

---

### Step 2: Reproduce Error Consistently

**Actions**:
1. **Gather error context**:
   - Error message and stack trace
   - Timestamp and frequency
   - User actions that triggered error
   - Environment (dev, staging, production)
   - Browser/OS (if frontend error)

2. **Create minimal reproduction**:
   ```bash
   # Example: API error
   curl -X POST http://localhost:3000/api/endpoint \
     -H "Content-Type: application/json" \
     -d '{"field": "value"}'

   # Example: Frontend error
   # Open browser, navigate to /page, click button X
   ```

3. **Verify reproduction**:
   - Can you trigger error reliably (100% of time)?
   - If intermittent: identify conditions (timing, data, state)

**Quality check**: Error reproduces consistently before proceeding to investigation.

---

### Step 3: Classify Error

**Actions**:
Use error classification matrix (see [reference.md](reference.md)):

**By type**:
- **Syntax**: Code doesn't compile/parse (typos, missing brackets)
- **Runtime**: Code runs but crashes (null pointer, type error)
- **Logic**: Code runs but produces wrong result
- **Integration**: External dependency fails (API, database, service)
- **Performance**: Code works but too slow (timeout, memory)

**By severity**:
- **Critical**: Data loss, security breach, total system failure
- **High**: Feature broken, blocks users
- **Medium**: Feature degraded, workaround exists
- **Low**: Minor UX issue, no functional impact

**Example**:
```markdown
## Error Classification

**Type**: Integration (API call to external service fails)
**Severity**: High (dashboard doesn't load, blocks teachers)
**Component**: StudentProgressService.fetchExternalData()
**Frequency**: 30% of requests (intermittent)
```

**Quality check**: Error type and severity correctly identified.

---

### Step 4: Isolate Root Cause

**Actions**:
Use systematic debugging techniques:

**1. Binary search** (for large codebases):
```bash
# Add logging at midpoint
# If error before midpoint: investigate first half
# If error after midpoint: investigate second half
# Repeat until narrowed to specific function
```

**2. Increase logging**:
```python
# Add debug logs around suspected area
logger.debug(f"Before API call: student_id={student_id}")
response = api.fetch_data(student_id)
logger.debug(f"After API call: response={response}")
```

**3. Use breakpoints** (if applicable):
```bash
# Python debugger
python -m pdb script.py

# Node.js debugger
node inspect server.js

# Browser debugger (Frontend)
# Set breakpoints in Chrome DevTools
```

**4. Check assumptions**:
- Is variable the value you expect?
- Is function being called when you expect?
- Are external dependencies available?

**5. Apply 5 Whys**:
```markdown
1. Why did the dashboard fail to load?
   → API call to external service timed out

2. Why did the API call timeout?
   → Request took >30 seconds (timeout limit)

3. Why did the request take >30 seconds?
   → External service response time was 45 seconds

4. Why was external service so slow?
   → Requesting too much data (1000 records instead of 10)

5. Why requesting 1000 records?
   → Missing pagination parameter in API call

**Root cause**: Missing pagination parameter causes over-fetching
```

**Quality check**: Root cause identified (not just symptoms).

---

### Step 5: Implement Fix

**Actions**:
1. **Write failing test** (if not exists):
   ```python
   def test_fetch_external_data_with_pagination():
       """Test that API call includes pagination parameter"""
       service = StudentProgressService()
       result = service.fetchExternalData(student_id=123)

       # Verify pagination applied
       assert len(result) <= 10  # Max 10 records per page
       assert result.has_next_page  # Pagination metadata present
   ```

2. **Implement fix**:
   ```python
   # Before (broken)
   def fetchExternalData(self, student_id):
       return api.get(f"/students/{student_id}/data")

   # After (fixed)
   def fetchExternalData(self, student_id, page_size=10):
       return api.get(
           f"/students/{student_id}/data",
           params={"page_size": page_size}
       )
   ```

3. **Verify fix**:
   ```bash
   # Run test
   pytest tests/test_student_progress_service.py::test_fetch_external_data_with_pagination
   # Should pass

   # Manually test reproduction steps
   # Error should no longer occur
   ```

**Quality check**: Fix addresses root cause (not just symptoms), tests pass.

---

### Step 6: Prevent Recurrence

**Actions**:
1. **Add tests for error scenario**:
   - Unit test for the specific bug
   - Integration test for the user flow
   - Regression test to catch if bug reintroduced

2. **Add defensive code** (if applicable):
   ```python
   # Validate inputs
   if page_size > 100:
       raise ValueError("page_size must be ≤100")

   # Handle errors gracefully
   try:
       result = api.get(url, params=params, timeout=5)
   except requests.Timeout:
       logger.error(f"API timeout: {url}")
       raise ServiceUnavailable("External service unavailable")
   ```

3. **Improve logging** (if needed):
   ```python
   # Log API calls with parameters
   logger.info(f"Fetching external data: student_id={student_id}, page_size={page_size}")

   # Log errors with context
   logger.error(
       f"API call failed: {url}",
       extra={"student_id": student_id, "params": params, "status_code": response.status_code}
   )
   ```

**Quality check**: Tests added, defensive code in place, logging improved.

---

### Step 7: Document in error-log.md

**Actions**:
1. Assign error ID (ERR-XXXX):
   ```bash
   # Get next available ID
   LAST_ID=$(grep -oP "ERR-\K\d+" error-log.md | sort -n | tail -1)
   NEXT_ID=$((LAST_ID + 1))
   # e.g., ERR-0042
   ```

2. Add error entry to `error-log.md`:
   ```markdown
   ## ERR-0042: Dashboard timeout due to missing pagination

   **Date**: 2025-10-21
   **Reporter**: John Doe (teacher)
   **Component**: StudentProgressService.fetchExternalData()
   **Type**: Integration
   **Severity**: High

   **Error Message**:
   ```
   TimeoutError: Request exceeded 30 second timeout
   at api.get (/src/services/api.ts:45)
   ```

   **Steps to Reproduce**:
   1. Navigate to /dashboard as teacher
   2. Click "View Progress" for student with 1000+ activities
   3. Dashboard hangs for 45 seconds, then shows timeout error

   **Root Cause**:
   Missing pagination parameter in API call to external service caused over-fetching (1000 records instead of 10), resulting in >30s response time exceeding timeout.

   **Fix**:
   Added `page_size=10` parameter to API call in StudentProgressService.fetchExternalData()

   **Files Changed**:
   - `api/app/services/student_progress_service.py`: Added pagination parameter
   - `api/app/tests/services/test_student_progress_service.py`: Added regression test

   **Prevention**:
   - Added unit test to verify pagination parameter included
   - Added input validation (max page_size=100)
   - Improved API logging to track parameters

   **Related Errors**: None
   **Status**: Fixed (2025-10-21)
   ```

**Quality check**: Error documented with all required fields.

---

### Step 8: Commit Fix

**Actions**:
```bash
git add api/app/services/student_progress_service.py \
        api/app/tests/services/test_student_progress_service.py \
        error-log.md

git commit -m "fix: add pagination to external data fetch (ERR-0042)

Root cause: Missing pagination parameter caused over-fetching
Impact: Dashboard timeout for students with 1000+ activities
Fix: Added page_size=10 parameter to API call

Changes:
- Added pagination parameter to fetchExternalData()
- Added regression test for pagination
- Updated error-log.md with ERR-0042

Prevents recurrence: Input validation + logging + tests
"
```

**Quality check**: Fix committed with detailed message referencing error ID.

---

## Common Mistakes to Avoid

### 🚫 Recurring Errors Not Recognized

**Impact**: Wasted debugging time, user frustration, technical debt

**Scenario**:
```
Same "Connection timeout" error debugged 3 times
Each time: Added 5-second delay as workaround
Never investigated root cause (connection pool exhaustion)
```

**Prevention**:
1. Search error-log.md BEFORE debugging
2. If error seen before: Review previous fix
3. If workaround was used: Implement permanent fix this time
4. Document patterns for future reference

---

### 🚫 Insufficient Error Context

**Impact**: Hard to reproduce, longer debug time, incomplete fixes

**Bad error log**:
```markdown
## Error: Something broke
**Date**: 2025-10-21
**Fix**: Restarted server
```

**Good error log**:
```markdown
## ERR-0042: Dashboard timeout due to missing pagination
**Date**: 2025-10-21 14:30:00 UTC
**Component**: StudentProgressService.fetchExternalData()
**Error Message**: [full stack trace]
**Steps to Reproduce**: [detailed steps]
**Root Cause**: [5 Whys analysis]
**Fix**: [specific code changes]
**Prevention**: [tests + logging added]
```

**Prevention**: Use error-log template with required fields

---

### 🚫 Treating Symptoms Instead of Root Cause

**Impact**: Error recurs, user frustration, wasted time

**Scenario**:
```
Symptom: API timeout
Quick fix: Increase timeout from 30s to 60s
Result: Still times out, just takes longer

Root cause: Over-fetching 1000 records
Real fix: Add pagination (response <1s)
```

**Prevention**: Use 5 Whys to find root cause, don't stop at first symptom

---

### 🚫 No Tests for Bug Fix

**Impact**: Bug can be reintroduced, no regression detection

**Prevention**:
- Always add regression test for the bug
- Test should fail before fix, pass after fix
- Run test suite to ensure no other breakage

---

### 🚫 Trial-and-Error Debugging

**Impact**: Wasted time, incomplete understanding, fragile fixes

**Bad approach**:
```
1. Change timeout value → still broken
2. Add try/catch → hides error
3. Restart service → works temporarily
4. Don't know why it works, ship it
```

**Good approach**:
```
1. Reproduce error consistently
2. Add logging to isolate cause
3. Identify root cause with 5 Whys
4. Implement targeted fix
5. Add tests to prevent recurrence
6. Document in error-log.md
```

**Prevention**: Follow systematic debugging workflow

---

## Best Practices

### ✅ Systematic Debugging Workflow

**Follow consistent process**:
```markdown
1. Search error-log.md for similar errors
2. Reproduce error consistently
3. Classify error (type + severity)
4. Isolate root cause (5 Whys, logging, breakpoints)
5. Implement fix + tests
6. Prevent recurrence (defensive code + logging)
7. Document in error-log.md with ERR-XXXX
8. Commit with detailed message
```

**Result**: Faster debugging, knowledge accumulation, no recurrence

---

### ✅ Error Log Template

**Use consistent format**:
```markdown
## ERR-XXXX: [Short description]

**Date**: [ISO 8601 timestamp]
**Reporter**: [Name/email]
**Component**: [File/function name]
**Type**: [Syntax/Runtime/Logic/Integration/Performance]
**Severity**: [Critical/High/Medium/Low]

**Error Message**:
```
[Full stack trace]
```

**Steps to Reproduce**:
1. [Step 1]
2. [Step 2]
3. [Expected vs actual]

**Root Cause**:
[5 Whys analysis]

**Fix**:
[Specific code changes]

**Files Changed**:
- [file1]: [what changed]
- [file2]: [what changed]

**Prevention**:
- [Tests added]
- [Logging improved]
- [Defensive code]

**Related Errors**: [ERR-YYYY, ERR-ZZZZ] or None
**Status**: Fixed ([date]) or In Progress
```

---

### ✅ 5 Whys Root Cause Analysis

**Ask "why" 5 times**:
```markdown
1. Why did X fail? → Because Y
2. Why did Y happen? → Because Z
3. Why did Z happen? → Because A
4. Why did A happen? → Because B
5. Why did B happen? → Because [root cause]
```

**Stop when**: Reached actionable root cause (not symptoms)

---

## Phase Checklist

**Pre-phase checks**:
- [ ] Error can be reproduced
- [ ] Logs/stack traces available
- [ ] Development environment ready

**During phase**:
- [ ] Searched error-log.md for similar errors
- [ ] Error reproduced consistently
- [ ] Error classified (type + severity)
- [ ] Root cause identified (not symptoms)
- [ ] Fix implemented and tested
- [ ] Regression tests added
- [ ] Error documented in error-log.md

**Post-phase validation**:
- [ ] Fix verified (error no longer occurs)
- [ ] Tests pass (including new regression tests)
- [ ] error-log.md updated with ERR-XXXX
- [ ] Fix committed with detailed message
- [ ] workflow-state.yaml updated

---

## Quality Standards

**Debugging quality targets**:
- Average debug time: <2 hours
- Error recurrence rate: <10%
- Errors documented: 100%

**What makes good debugging**:
- Systematic approach (consistent workflow)
- Root cause identified (not symptoms)
- Fix tested (regression tests added)
- Well documented (error-log.md entry complete)
- Knowledge shared (prevents recurrence)

**What makes bad debugging**:
- Trial-and-error (no systematic approach)
- Treats symptoms (root cause unknown)
- No tests (bug can recur)
- Undocumented (knowledge lost)
- Quick workarounds (technical debt)

---

## Completion Criteria

**Phase is complete when**:
- [ ] Error no longer reproduces
- [ ] Root cause identified and fixed
- [ ] Tests added (regression + prevention)
- [ ] error-log.md updated with ERR-XXXX
- [ ] Fix committed
- [ ] workflow-state.yaml shows `currentPhase: debug` and `status: completed`

**Ready to proceed**:
- [ ] All tests pass
- [ ] Feature works as expected
- [ ] No known errors remaining

---

## Troubleshooting

**Issue**: Cannot reproduce error
**Solution**: Gather more context (logs, user steps, environment), check for timing/data dependencies

**Issue**: Error is intermittent
**Solution**: Identify conditions (timing, load, data state), add logging to narrow down triggers

**Issue**: Root cause unclear
**Solution**: Use 5 Whys, add more logging, use debugger/breakpoints, consult error-log.md patterns

**Issue**: Fix works but not sure why
**Solution**: Insufficient understanding - continue investigation, don't ship unclear fixes

---

_This SOP guides the debug phase. Refer to reference.md for debugging techniques and examples.md for debugging patterns._

