debugging — independently scanned and version-tracked by SaferSkills.
SaferSkills independently audited debugging (Agent Skill) and scored it 100/100 (green). The audit ran 55 deterministic rules across Security, Supply Chain, Maintenance, Transparency, and Community; it found 0 high-severity and 0 lower-severity findings. The full rule-by-rule trace and per-finding evidence are below. Free, methodology-open.
Findings & checks · 0 flagged
Every scanned point with the score it earned and what moved between them.
First recorded scan — no prior version to compare against.
The primary manifest — the file an agent reads to learn what this artifact does.
Collect all relevant context about the issue:
Error details:
Environment:
# Check recent changes
git log --oneline -10
git diff HEAD~5
# Check dependency versions
npm list --depth=0 # Node.js
pip freeze # PythonCreate a minimal, reproducible example:
# Bad: Vague description
"The function sometimes fails"
# Good: Specific reproduction steps
"""
1. Call process_data() with input: {"id": None}
2. Error occurs: TypeError at line 45
3. Expected: Return empty dict
4. Actual: Raises exception
"""
# Minimal reproduction
def test_reproduce_bug():
result = process_data({"id": None}) # Fails here
assert result == {}Use binary search debugging to narrow down the issue:
Print/Log debugging:
def problematic_function(data):
print(f"[DEBUG] Input: {data}") # Entry point
result = step_one(data)
print(f"[DEBUG] After step_one: {result}")
result = step_two(result)
print(f"[DEBUG] After step_two: {result}") # Issue here?
return step_three(result)Divide and conquer:
# Comment out half the code
# If error persists: bug is in remaining half
# If error gone: bug is in commented half
# Repeat until isolatedCommon bug patterns and solutions:
| Pattern | Symptom | Solution |
|---|---|---|
| Off-by-one | Index out of bounds | Check loop bounds |
| Null reference | NullPointerException | Add null checks |
| Race condition | Intermittent failures | Add synchronization |
| Memory leak | Gradual slowdown | Check resource cleanup |
| Type mismatch | Unexpected behavior | Validate types |
Questions to ask:
Apply the fix with proper verification:
# Before: Bug
def get_user(user_id):
return users[user_id] # KeyError if not found
# After: Fix with proper handling
def get_user(user_id):
if user_id not in users:
return None # Or raise custom exception
return users[user_id]Fix checklist:
Ensure the fix works and prevent regression:
# Add test for the specific bug
def test_bug_fix_issue_123():
"""Regression test for issue #123: KeyError on missing user"""
result = get_user("nonexistent_id")
assert result is None # Should not raise
# Add edge case tests
@pytest.mark.parametrize("input,expected", [
(None, None),
("", None),
("valid_id", {"name": "User"}),
])
def test_get_user_edge_cases(input, expected):
assert get_user(input) == expectedError:
TypeError: cannot unpack non-iterable NoneType object
File "app.py", line 25, in process
name, email = get_user_info(user_id)Analysis:
# Problem: get_user_info returns None when user not found
def get_user_info(user_id):
user = db.find_user(user_id)
if user:
return user.name, user.email
# Missing: return None case!
# Fix: Handle None case
def get_user_info(user_id):
user = db.find_user(user_id)
if user:
return user.name, user.email
return None, None # Or raise UserNotFoundErrorSymptom: Test passes locally, fails in CI intermittently
Analysis:
# Problem: Shared state without synchronization
class Counter:
def __init__(self):
self.value = 0
def increment(self):
self.value += 1 # Not atomic!
# Fix: Add thread safety
import threading
class Counter:
def __init__(self):
self.value = 0
self._lock = threading.Lock()
def increment(self):
with self._lock:
self.value += 1Tool: Use memory profiler
from memory_profiler import profile
@profile
def process_large_data():
results = []
for item in large_dataset:
results.append(transform(item)) # Memory grows
return results
# Fix: Use generator for large datasets
def process_large_data():
for item in large_dataset:
yield transform(item) # Memory efficient| Language | Debugger | Profiler |
|---|---|---|
| Python | pdb, ipdb | cProfile, memory_profiler |
| JavaScript | Chrome DevTools | Performance tab |
| Java | IntelliJ Debugger | JProfiler, VisualVM |
| Go | Delve | pprof |
| Rust | rust-gdb | cargo-flamegraph |
~30 seconds. Free. No account. Every finding cites a rule and a line of evidence.