Initial commit
This commit is contained in:
714
references/issue-patterns.md
Normal file
714
references/issue-patterns.md
Normal file
@@ -0,0 +1,714 @@
|
||||
# Issue Patterns Reference
|
||||
|
||||
Common issue types and specialized approaches for each.
|
||||
|
||||
## Bug Reports
|
||||
|
||||
### Characteristics
|
||||
- Something is broken
|
||||
- Current behavior doesn't match expected
|
||||
- Often includes error messages
|
||||
- May have reproduction steps
|
||||
|
||||
### Analysis Pattern
|
||||
|
||||
**1. Reproduce**
|
||||
- Follow reproduction steps exactly
|
||||
- Verify bug exists
|
||||
- Note environment details
|
||||
|
||||
**2. Isolate**
|
||||
- Minimal test case
|
||||
- Remove unrelated factors
|
||||
- Identify triggering conditions
|
||||
|
||||
**3. Locate**
|
||||
- Find where error occurs
|
||||
- Trace backwards to cause
|
||||
- Identify root cause vs symptoms
|
||||
|
||||
**4. Fix Strategy**
|
||||
- Fix root cause, not symptoms
|
||||
- Handle similar edge cases
|
||||
- Don't break working cases
|
||||
- Add regression test
|
||||
|
||||
### Common Bug Patterns
|
||||
|
||||
**Null/Undefined Errors:**
|
||||
```javascript
|
||||
// Bug: Crashes when data is null
|
||||
function process(data) {
|
||||
return data.value // TypeError if data is null
|
||||
}
|
||||
|
||||
// Fix: Handle null case
|
||||
function process(data) {
|
||||
if (!data) return defaultValue
|
||||
return data.value
|
||||
}
|
||||
|
||||
// Test
|
||||
expect(process(null)).toBe(defaultValue)
|
||||
```
|
||||
|
||||
**Off-by-One Errors:**
|
||||
```python
|
||||
# Bug: Skips last element
|
||||
for i in range(len(arr) - 1):
|
||||
process(arr[i])
|
||||
|
||||
# Fix
|
||||
for i in range(len(arr)):
|
||||
process(arr[i])
|
||||
|
||||
# Or better
|
||||
for item in arr:
|
||||
process(item)
|
||||
```
|
||||
|
||||
**Race Conditions:**
|
||||
```javascript
|
||||
// Bug: State changes between check and use
|
||||
if (cache.has(key)) {
|
||||
return cache.get(key) // Might be deleted by now
|
||||
}
|
||||
|
||||
// Fix: Get once, check result
|
||||
const value = cache.get(key)
|
||||
if (value !== undefined) {
|
||||
return value
|
||||
}
|
||||
```
|
||||
|
||||
**Input Validation:**
|
||||
```javascript
|
||||
// Bug: No validation
|
||||
function divide(a, b) {
|
||||
return a / b // Division by zero
|
||||
}
|
||||
|
||||
// Fix: Validate inputs
|
||||
function divide(a, b) {
|
||||
if (b === 0) {
|
||||
throw new Error('Division by zero')
|
||||
}
|
||||
return a / b
|
||||
}
|
||||
```
|
||||
|
||||
---
|
||||
|
||||
## Feature Requests
|
||||
|
||||
### Characteristics
|
||||
- Request for new functionality
|
||||
- Describes user need
|
||||
- May include use cases
|
||||
- May have mockups/examples
|
||||
|
||||
### Analysis Pattern
|
||||
|
||||
**1. Understand Need**
|
||||
- Who needs this?
|
||||
- What problem does it solve?
|
||||
- What are use cases?
|
||||
- Why existing features insufficient?
|
||||
|
||||
**2. Design API/Interface**
|
||||
- How will users interact?
|
||||
- What's the simplest interface?
|
||||
- Consistent with existing features?
|
||||
- Extensible for future needs?
|
||||
|
||||
**3. Plan Implementation**
|
||||
- Where does it fit architecturally?
|
||||
- What components affected?
|
||||
- Data model changes needed?
|
||||
- Breaking changes?
|
||||
|
||||
**4. Implementation Strategy**
|
||||
- Start with minimal viable version
|
||||
- Add polish incrementally
|
||||
- Get feedback early
|
||||
- Document well
|
||||
|
||||
### Feature Types
|
||||
|
||||
**UI Feature:**
|
||||
```markdown
|
||||
**Checklist:**
|
||||
- [ ] Component implementation
|
||||
- [ ] State management
|
||||
- [ ] Event handling
|
||||
- [ ] Styling
|
||||
- [ ] Responsive design
|
||||
- [ ] Accessibility
|
||||
- [ ] Loading states
|
||||
- [ ] Error states
|
||||
- [ ] User feedback (success/error messages)
|
||||
```
|
||||
|
||||
**API Endpoint:**
|
||||
```markdown
|
||||
**Checklist:**
|
||||
- [ ] Route definition
|
||||
- [ ] Request validation
|
||||
- [ ] Business logic
|
||||
- [ ] Response formatting
|
||||
- [ ] Error handling
|
||||
- [ ] Authentication/authorization
|
||||
- [ ] Rate limiting (if needed)
|
||||
- [ ] API documentation
|
||||
- [ ] Integration tests
|
||||
```
|
||||
|
||||
**CLI Command:**
|
||||
```markdown
|
||||
**Checklist:**
|
||||
- [ ] Command definition
|
||||
- [ ] Argument parsing
|
||||
- [ ] Validation
|
||||
- [ ] Core logic
|
||||
- [ ] Output formatting
|
||||
- [ ] Error messages
|
||||
- [ ] Help text
|
||||
- [ ] Examples in docs
|
||||
```
|
||||
|
||||
**Library Function:**
|
||||
```markdown
|
||||
**Checklist:**
|
||||
- [ ] Function signature design
|
||||
- [ ] Input validation
|
||||
- [ ] Core implementation
|
||||
- [ ] Error handling
|
||||
- [ ] Documentation (JSDoc/docstrings)
|
||||
- [ ] Usage examples
|
||||
- [ ] Type definitions
|
||||
- [ ] Backwards compatibility
|
||||
```
|
||||
|
||||
---
|
||||
|
||||
## Documentation Issues
|
||||
|
||||
### Characteristics
|
||||
- Missing or unclear docs
|
||||
- Outdated information
|
||||
- Requests for examples
|
||||
- Typos or formatting
|
||||
|
||||
### Analysis Pattern
|
||||
|
||||
**1. Identify Gap**
|
||||
- What's missing?
|
||||
- Who's the audience?
|
||||
- What level of detail?
|
||||
- Where should it live?
|
||||
|
||||
**2. Research**
|
||||
- Understand the feature fully
|
||||
- Find code examples
|
||||
- Check similar docs
|
||||
- Verify current behavior
|
||||
|
||||
**3. Write**
|
||||
- Clear and concise
|
||||
- Examples included
|
||||
- Proper formatting
|
||||
- Links to related docs
|
||||
|
||||
**4. Verify**
|
||||
- Technically accurate
|
||||
- Examples work
|
||||
- No broken links
|
||||
- Proper grammar/spelling
|
||||
|
||||
### Documentation Types
|
||||
|
||||
**Tutorials:**
|
||||
```markdown
|
||||
**Structure:**
|
||||
1. What you'll build
|
||||
2. Prerequisites
|
||||
3. Step-by-step instructions
|
||||
4. Expected results
|
||||
5. Next steps
|
||||
|
||||
**Style:**
|
||||
- Conversational
|
||||
- Hand-holding
|
||||
- Complete working example
|
||||
- Learn by doing
|
||||
```
|
||||
|
||||
**How-To Guides:**
|
||||
```markdown
|
||||
**Structure:**
|
||||
1. Problem statement
|
||||
2. Solution approach
|
||||
3. Step-by-step
|
||||
4. Variations/alternatives
|
||||
|
||||
**Style:**
|
||||
- Task-oriented
|
||||
- Practical
|
||||
- Assumes some knowledge
|
||||
- Shows best practices
|
||||
```
|
||||
|
||||
**Reference:**
|
||||
```markdown
|
||||
**Structure:**
|
||||
1. Function/API signature
|
||||
2. Parameters
|
||||
3. Return value
|
||||
4. Errors/exceptions
|
||||
5. Examples
|
||||
6. See also
|
||||
|
||||
**Style:**
|
||||
- Precise
|
||||
- Complete
|
||||
- Technical
|
||||
- Searchable
|
||||
```
|
||||
|
||||
**Conceptual:**
|
||||
```markdown
|
||||
**Structure:**
|
||||
1. Overview
|
||||
2. Key concepts
|
||||
3. How it works
|
||||
4. When to use
|
||||
5. Related topics
|
||||
|
||||
**Style:**
|
||||
- Explanatory
|
||||
- Big picture
|
||||
- Theory and context
|
||||
- Understanding-focused
|
||||
```
|
||||
|
||||
---
|
||||
|
||||
## Refactoring Issues
|
||||
|
||||
### Characteristics
|
||||
- Code quality improvement
|
||||
- No behavior change
|
||||
- Technical debt
|
||||
- Maintainability focus
|
||||
|
||||
### Analysis Pattern
|
||||
|
||||
**1. Identify Problems**
|
||||
- Code smells
|
||||
- Duplication
|
||||
- Complexity
|
||||
- Poor naming
|
||||
- Tight coupling
|
||||
|
||||
**2. Ensure Test Coverage**
|
||||
- Tests exist for current behavior
|
||||
- Tests are comprehensive
|
||||
- Tests will catch regressions
|
||||
|
||||
**3. Plan Incremental Steps**
|
||||
- Small, safe transformations
|
||||
- Each step leaves code working
|
||||
- Can pause/resume anytime
|
||||
|
||||
**4. Execute Carefully**
|
||||
- One refactoring at a time
|
||||
- Run tests after each step
|
||||
- Commit working states
|
||||
- Don't mix with feature work
|
||||
|
||||
### Refactoring Patterns
|
||||
|
||||
**Extract Function:**
|
||||
```javascript
|
||||
// Before: Long complex function
|
||||
function processOrder(order) {
|
||||
// 50 lines of code
|
||||
// mixing concerns
|
||||
}
|
||||
|
||||
// After: Extracted smaller functions
|
||||
function processOrder(order) {
|
||||
validateOrder(order)
|
||||
const items = prepareItems(order.items)
|
||||
const total = calculateTotal(items)
|
||||
return createInvoice(order, items, total)
|
||||
}
|
||||
|
||||
function validateOrder(order) { /* ... */ }
|
||||
function prepareItems(items) { /* ... */ }
|
||||
function calculateTotal(items) { /* ... */ }
|
||||
function createInvoice(order, items, total) { /* ... */ }
|
||||
```
|
||||
|
||||
**Remove Duplication:**
|
||||
```python
|
||||
# Before: Duplicated logic
|
||||
def process_user_data(data):
|
||||
if not data:
|
||||
raise ValueError("Invalid data")
|
||||
# process...
|
||||
|
||||
def process_order_data(data):
|
||||
if not data:
|
||||
raise ValueError("Invalid data")
|
||||
# process...
|
||||
|
||||
# After: Extracted common logic
|
||||
def validate_data(data):
|
||||
if not data:
|
||||
raise ValueError("Invalid data")
|
||||
|
||||
def process_user_data(data):
|
||||
validate_data(data)
|
||||
# process...
|
||||
|
||||
def process_order_data(data):
|
||||
validate_data(data)
|
||||
# process...
|
||||
```
|
||||
|
||||
**Improve Naming:**
|
||||
```javascript
|
||||
// Before: Unclear names
|
||||
function calc(x, y) {
|
||||
const t = x * y
|
||||
const d = t * 0.1
|
||||
return t - d
|
||||
}
|
||||
|
||||
// After: Clear names
|
||||
function calculateTotalWithDiscount(price, quantity) {
|
||||
const subtotal = price * quantity
|
||||
const discount = subtotal * 0.1
|
||||
return subtotal - discount
|
||||
}
|
||||
```
|
||||
|
||||
**Reduce Complexity:**
|
||||
```javascript
|
||||
// Before: Deep nesting
|
||||
function process(data) {
|
||||
if (data) {
|
||||
if (data.items) {
|
||||
if (data.items.length > 0) {
|
||||
// process
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
// After: Early returns
|
||||
function process(data) {
|
||||
if (!data) return
|
||||
if (!data.items) return
|
||||
if (data.items.length === 0) return
|
||||
|
||||
// process
|
||||
}
|
||||
```
|
||||
|
||||
---
|
||||
|
||||
## Performance Issues
|
||||
|
||||
### Characteristics
|
||||
- Something is slow
|
||||
- Resource usage high
|
||||
- Scalability problems
|
||||
- May include benchmarks
|
||||
|
||||
### Analysis Pattern
|
||||
|
||||
**1. Measure**
|
||||
- Reproduce performance issue
|
||||
- Measure current performance
|
||||
- Profile to find bottleneck
|
||||
- Get baseline numbers
|
||||
|
||||
**2. Identify Cause**
|
||||
- Algorithm complexity
|
||||
- Unnecessary work
|
||||
- Resource leaks
|
||||
- Inefficient data structures
|
||||
|
||||
**3. Optimize**
|
||||
- Fix the bottleneck
|
||||
- Use better algorithm
|
||||
- Cache when appropriate
|
||||
- Lazy load when possible
|
||||
|
||||
**4. Verify**
|
||||
- Measure improvement
|
||||
- Check correctness maintained
|
||||
- Verify no regressions
|
||||
- Document tradeoffs
|
||||
|
||||
### Performance Patterns
|
||||
|
||||
**Algorithm Optimization:**
|
||||
```javascript
|
||||
// Before: O(n²)
|
||||
function findDuplicates(arr) {
|
||||
const dupes = []
|
||||
for (let i = 0; i < arr.length; i++) {
|
||||
for (let j = i + 1; j < arr.length; j++) {
|
||||
if (arr[i] === arr[j]) {
|
||||
dupes.push(arr[i])
|
||||
}
|
||||
}
|
||||
}
|
||||
return dupes
|
||||
}
|
||||
|
||||
// After: O(n)
|
||||
function findDuplicates(arr) {
|
||||
const seen = new Set()
|
||||
const dupes = new Set()
|
||||
for (const item of arr) {
|
||||
if (seen.has(item)) {
|
||||
dupes.add(item)
|
||||
}
|
||||
seen.add(item)
|
||||
}
|
||||
return Array.from(dupes)
|
||||
}
|
||||
```
|
||||
|
||||
**Caching:**
|
||||
```javascript
|
||||
// Before: Recalculates every time
|
||||
function expensiveCalculation(data) {
|
||||
// Heavy computation
|
||||
return result
|
||||
}
|
||||
|
||||
// After: Cache results
|
||||
const cache = new Map()
|
||||
function expensiveCalculation(data) {
|
||||
const key = JSON.stringify(data)
|
||||
if (cache.has(key)) {
|
||||
return cache.get(key)
|
||||
}
|
||||
const result = /* heavy computation */
|
||||
cache.set(key, result)
|
||||
return result
|
||||
}
|
||||
```
|
||||
|
||||
**Lazy Loading:**
|
||||
```javascript
|
||||
// Before: Load everything upfront
|
||||
const data = loadAllData() // Slow!
|
||||
|
||||
// After: Load on demand
|
||||
let data = null
|
||||
function getData() {
|
||||
if (!data) {
|
||||
data = loadAllData()
|
||||
}
|
||||
return data
|
||||
}
|
||||
```
|
||||
|
||||
---
|
||||
|
||||
## Security Issues
|
||||
|
||||
### Characteristics
|
||||
- Security vulnerability
|
||||
- Potential exploit
|
||||
- Missing validation
|
||||
- Unsafe practices
|
||||
|
||||
### Analysis Pattern
|
||||
|
||||
**1. Assess Severity**
|
||||
- What can attacker do?
|
||||
- What data is at risk?
|
||||
- Who is affected?
|
||||
- How easy to exploit?
|
||||
|
||||
**2. Identify Root Cause**
|
||||
- Missing validation?
|
||||
- Unsafe API usage?
|
||||
- Incorrect logic?
|
||||
- Outdated dependency?
|
||||
|
||||
**3. Fix Securely**
|
||||
- Validate all inputs
|
||||
- Use safe APIs
|
||||
- Follow security best practices
|
||||
- Don't roll your own crypto
|
||||
|
||||
**4. Verify Fix**
|
||||
- Test exploit no longer works
|
||||
- Check similar code
|
||||
- Add security tests
|
||||
- Consider security review
|
||||
|
||||
### Security Patterns
|
||||
|
||||
**Input Validation:**
|
||||
```javascript
|
||||
// Before: No validation
|
||||
app.post('/user/:id', (req, res) => {
|
||||
const query = `SELECT * FROM users WHERE id = ${req.params.id}`
|
||||
db.query(query) // SQL injection!
|
||||
})
|
||||
|
||||
// After: Validated and parameterized
|
||||
app.post('/user/:id', (req, res) => {
|
||||
const id = parseInt(req.params.id, 10)
|
||||
if (isNaN(id)) {
|
||||
return res.status(400).json({ error: 'Invalid ID' })
|
||||
}
|
||||
const query = 'SELECT * FROM users WHERE id = ?'
|
||||
db.query(query, [id]) // Safe
|
||||
})
|
||||
```
|
||||
|
||||
**XSS Prevention:**
|
||||
```javascript
|
||||
// Before: Direct HTML insertion
|
||||
element.innerHTML = userInput // XSS!
|
||||
|
||||
// After: Escaped text
|
||||
element.textContent = userInput // Safe
|
||||
// Or use framework's escaping
|
||||
element.innerHTML = escapeHtml(userInput)
|
||||
```
|
||||
|
||||
**Authorization:**
|
||||
```javascript
|
||||
// Before: No auth check
|
||||
app.delete('/user/:id', (req, res) => {
|
||||
deleteUser(req.params.id) // Anyone can delete!
|
||||
})
|
||||
|
||||
// After: Check permissions
|
||||
app.delete('/user/:id', requireAuth, (req, res) => {
|
||||
if (req.user.id !== req.params.id && !req.user.isAdmin) {
|
||||
return res.status(403).json({ error: 'Forbidden' })
|
||||
}
|
||||
deleteUser(req.params.id)
|
||||
})
|
||||
```
|
||||
|
||||
---
|
||||
|
||||
## CI/CD Issues
|
||||
|
||||
### Characteristics
|
||||
- Build failures
|
||||
- Test flakiness
|
||||
- Deployment problems
|
||||
- Pipeline configuration
|
||||
|
||||
### Analysis Pattern
|
||||
|
||||
**1. Reproduce Locally**
|
||||
- Can you reproduce the issue?
|
||||
- Environment differences?
|
||||
- Missing dependencies?
|
||||
|
||||
**2. Identify Cause**
|
||||
- Check CI logs
|
||||
- Look for error messages
|
||||
- Compare with working runs
|
||||
- Check recent changes
|
||||
|
||||
**3. Fix**
|
||||
- Update configuration
|
||||
- Fix flaky tests
|
||||
- Add missing dependencies
|
||||
- Improve reliability
|
||||
|
||||
**4. Verify**
|
||||
- Passes consistently
|
||||
- Doesn't break other jobs
|
||||
- Works across environments
|
||||
|
||||
### CI/CD Patterns
|
||||
|
||||
**Flaky Test Fix:**
|
||||
```javascript
|
||||
// Before: Flaky due to timing
|
||||
test('updates after delay', () => {
|
||||
triggerUpdate()
|
||||
expect(getValue()).toBe(newValue) // Sometimes fails
|
||||
})
|
||||
|
||||
// After: Proper async handling
|
||||
test('updates after delay', async () => {
|
||||
triggerUpdate()
|
||||
await waitFor(() => expect(getValue()).toBe(newValue))
|
||||
})
|
||||
```
|
||||
|
||||
**Environment-Specific Fix:**
|
||||
```javascript
|
||||
// Before: Assumes specific OS
|
||||
const path = '/usr/local/bin' // Fails on Windows
|
||||
|
||||
// After: Cross-platform
|
||||
const path = require('path').join(os.homedir(), 'bin')
|
||||
```
|
||||
|
||||
---
|
||||
|
||||
## Dependency Updates
|
||||
|
||||
### Characteristics
|
||||
- Upgrade library version
|
||||
- Fix security vulnerability
|
||||
- Get new features
|
||||
- Maintenance
|
||||
|
||||
### Analysis Pattern
|
||||
|
||||
**1. Check Changes**
|
||||
- Read changelog
|
||||
- Review breaking changes
|
||||
- Check migration guide
|
||||
- Assess impact
|
||||
|
||||
**2. Update**
|
||||
- Update package version
|
||||
- Update code if needed
|
||||
- Update tests
|
||||
- Update docs
|
||||
|
||||
**3. Test Thoroughly**
|
||||
- All tests pass
|
||||
- Manual testing
|
||||
- Check for regressions
|
||||
- Verify new version works
|
||||
|
||||
**4. Document**
|
||||
- Note breaking changes
|
||||
- Update dependencies list
|
||||
- Mention in changelog
|
||||
|
||||
---
|
||||
|
||||
## Using This Reference
|
||||
|
||||
When analyzing an issue:
|
||||
|
||||
1. Identify issue type
|
||||
2. Read corresponding pattern
|
||||
3. Follow analysis checklist
|
||||
4. Apply relevant code patterns
|
||||
5. Adapt to specific context
|
||||
|
||||
Each project and issue is unique - use these as starting points, not rigid rules.
|
||||
Reference in New Issue
Block a user