debug-systems — independently scanned and version-tracked by SaferSkills.
SaferSkills independently audited debug-systems (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.
Debugging is not guessing. It is systematic elimination through all three layers: runtime, OS, production. This skill enforces that protocol.
/debug commandBefore anything else, the error must be reproducible.
If it's intermittent: that's a clue. Intermittent failures are usually concurrency, resource exhaustion, or timing-dependent. Note it and proceed.
Read the traceback bottom-up. The last frame is where it died. The frames above show how it got there.
Coach asks:
The student must explain the execution path that led to the error. Not "it crashed on line 42" -- "the function received None because the dictionary lookup on line 38 used a key that doesn't exist, which returned None because we used .get() instead of [], and that None propagated to line 42 where we called .strip() on it."
Many Python errors are symptoms of OS-level problems. Check the system.
What to check:
ulimit -a -- resource limits (open files, stack size, max processes)/proc/self/status or resource.getrusage() -- memory usage (VmRSS, VmPeak)ls /proc/self/fd | wc -l -- open file descriptorsps aux | grep python -- process state, CPU%, MEM%dmesg | tail -- kernel messages (OOM killer, segfault)df -h -- disk space (silent killer of writes)free -h -- available memoryCoach asks:
Connect the bug to its production implications.
Coach asks:
Common Python errors mapped to their OS-level causes:
| Python Error | OS/System Cause | What to Check | |
|---|---|---|---|
ConnectionRefusedError | Remote port has no listener. TCP RST packet sent back. | ss -tlnp on remote. Is the service running? Firewall rules? | |
ConnectionResetError | Remote closed the connection (RST). Often: server crashed, load balancer timeout, or TLS mismatch. | Server logs. tcpdump for RST packets. Load balancer idle timeout config. | |
MemoryError | Process hit memory limit. Either ulimit -v, cgroup limit, or actual OOM. Kernel OOM killer may have been involved. | `dmesg \ | grep -i oom. /proc/self/status VmPeak. cgroup` memory.max. |
OSError: Too many open files | Process fd count hit ulimit -n (default 1024). Leaked fds from unclosed files/sockets/connections. | `ls /proc/self/fd \ | wc -l. lsof -p <pid>. Look for missing close() or missing with` statements. |
TimeoutError | TCP retransmission timeout (~30s default). Network partition, slow server, or DNS resolution hang. | ping the host. traceroute. Check DNS with dig. ss -tn state time-wait. | |
BrokenPipeError | Writing to a closed socket fd. The reader closed their end (sent FIN), you kept writing, kernel sends SIGPIPE (Python catches it and raises). | Check if the client disconnected. Check response size -- large responses hit this when clients give up. | |
FileNotFoundError | open() syscall returned ENOENT. File doesn't exist at that path, or a symlink is broken. | stat the file. Check working directory (os.getcwd()). Check symlinks with readlink. | |
PermissionError | open() syscall returned EACCES. File exists but process UID/GID lacks permission. | ls -la the file. id to check current user. stat for owner/group/mode. | |
BlockingIOError | Non-blocking socket has no data ready. recv() returned EAGAIN/EWOULDBLOCK. | Expected in async code. If unexpected: socket was set non-blocking without using an event loop. | |
RecursionError | C stack overflow. CPython has a recursion limit (default 1000) to prevent segfault from C stack exhaustion. | sys.getrecursionlimit(). The real limit is the C stack size (ulimit -s, default 8MB). Deep recursion = rewrite as iteration. | |
SegmentationFault | Process accessed invalid memory address. SIGSEGV from kernel. Usually a C extension bug, not Python. | dmesg for the segfault log (shows instruction pointer and fault address). Run under gdb python3 -c "...". Check C extension versions. | |
Killed (no traceback) | Kernel OOM killer sent SIGKILL. Process was the biggest memory consumer. No cleanup, no exception, no handler. | `dmesg \ | grep -i 'killed process'`. Check cgroup limits. Reduce memory usage or increase limits. |
Error occurs
|
+-- Is there a traceback?
| YES --> Read bottom-up (Step 2)
| NO --> Process was killed externally
| Check: dmesg, OOM killer, SIGKILL, cgroup limits
|
+-- Is the error reproducible?
| YES --> Systematic elimination through layers
| NO --> Concurrency, resource exhaustion, or timing
| Add logging, check under load, check resource limits
|
+-- Is it a Python error or OS error?
Python (TypeError, ValueError, KeyError) --> Layer 1 trace
OS (OSError subclass) --> Layer 2 check first
Silent failure (wrong output, no crash) --> Layer 1 trace + add assertions~30 seconds. Free. No account. Every finding cites a rule and a line of evidence.