My guard hook found nc in cancel
In five weeks my Claude Code guard hook blocked 82 commands in my own projects. 53 were the exfiltration rule, and only one looked like what that rule is for. The agent learned to route around it.
My name is Ronnie. I'm a product-minded software engineer, building SaaS products and the infrastructure that runs them.
I live on California's Redwood Coast and have been building software for over 15 years. That work covers code, cloud infrastructure, security, and leading engineering teams.
Currently, you can find me leading engineering efforts as Partner and CTO of KABI Automotive. I also explore the edges of AI at BuildTestRun and share what I'm building and learning on my YouTube channel, Build at Scale. The notes below are where I write down what I build and what breaks.
In five weeks my Claude Code guard hook blocked 82 commands in my own projects. 53 were the exfiltration rule, and only one looked like what that rule is for. The agent learned to route around it.
I wanted test screenshots in a PR as native GitHub attachments. gh can attach files now, but only with write access to the repo that holds the PR. From a fork into a read-only repo, that left the web editor.
Claude Code runs Bash tool commands in my login shell, which is zsh. Over five weeks, five zsh behaviors broke bash-style one-liners, and one grep error happened 29 times.
A branch ran against shared databases and queues before it merged. Its jobs, its mailer, and one new STI row reached code on main that had never heard of those classes.
A setup script for a Claude Code cloud environment never finished. A prebuilt Ruby only ran from its build path, and a bare wait was waiting on the tee process that logged the script.
An MCP server in a Rails app signed in fine from claude.ai, but desktop clients got a 403 from the load balancer. A managed WAF rule read the loopback redirect URL in the OAuth request as an SSRF attempt.
A Rails test suite took 5 minutes per suite on an Apple silicon Mac. The container was amd64 under Rosetta with YJIT on, and one spec file ran in 3.5 minutes instead of 28 seconds.