Debugging a Pi Zero 2W BadUSB with Claude Code: Fixing an 'Impossible' Bug

About 10 months ago, a developer built a Pi Zero 2W BadUSB toolkit but one feature — "fully resets between attacks" — never worked. Marked as WIP, it was abandoned. This week, they rebuilt the project end-to-end with Claude Code as a pair-programmer. The result: the "impossible" feature now works, and the session uncovered several subtle bugs.
What Claude Code Did
- Diagnosed root cause in one read: The listener watched
/dev/hidg0existence — true from boot — so it fired payloads on power-up regardless of host attachment. The correct signal is/sys/class/udc/<udc>/state == "configured". - Empirically confirmed hardware limitation: When the first fix didn't fully work, Claude SSHed in, asked the dev to plug/unplug while it polled sysfs and the dwc2 debugfs
regdumpregister. It found theGOTGCTLregister freezes at0x000d0000regardless of cable state — the Pi Zero 2W has no VBUS sense wired to the SoC's OTG block. It pivoted to an active-unbind workaround with cooldown + rate-limit safeguard. - Caught a silent Python bug:
open(udc_path, "w").write("")doesn't invokewrite(2)with zero bytes — CPython'sTextIOWrapperelides the call. The unbind was a no-op for an hour of testing. Fixed toos.write(fd, b"\n")to force a syscall. - Fixed forbidden-on-configfs teardown:
rm -rfwas failing because configfs forbids unlinking kernel-managed attribute files. Proper sequence isrmdir-only, leaf-to-root. - Wrote a 34-test pytest suite against a mock HID engine, enabling parser testing on any host without a Pi.
- Updated AI memory: The developer uses Postgres as long-term memory for Claude — those bug entries are now referenced in similar configfs/USB-gadget projects.
The entire working session took about 4 hours, mostly waiting for physical plug/unplug. The PR had six well-scoped commits with proper co-author tags and a test plan. The project (Pi-Zero-2W-Bad-USB) is MIT licensed, with Ducky-Script-style payload language, variables, IF/WHILE, HOLD/RELEASE, INJECT MOD, RANDOM *, US/UK keymaps, optional RO mass-storage gadget, systemd integration, and idempotent installer.
For developers doing hardware-in-the-loop workflows with Claude Code, this is a compelling case study in AI-assisted debugging at the sysfs and register level.
📖 Read the full source: r/ClaudeAI
👀 See Also

Running Tesla Model 3 Computer on Desk with Salvaged Parts
A researcher successfully booted a Tesla Model 3's computer on a desk using parts from crashed cars, requiring a 12V power supply, touchscreen, and custom cabling. The setup revealed an internal network with SSH and web servers accessible at specific IP addresses.

OpenClaw AI agent autonomously identifies bug, creates and submits GitHub PR
A developer reports their OpenClaw AI agent diagnosed a recurring issue, traced it to a third-party package, then autonomously created a GitHub branch, made multiple commits, reviewed its own code, and submitted a pull request to the package repository.

RunLobster AI agent builds functional dashboard from natural language request
A developer reports that RunLobster built and deployed a complete dashboard with Stripe integration and authentication in response to a single natural language command, completing in minutes what would normally take days.

Forge agent autonomously fixes GitHub bug using Claude AI
A developer's Forge agent detected a GitHub bug report, triggered a pipeline, used Claude AI to analyze and fix the issue, and opened a PR—all without human intervention while the developer slept.