📽️ My talk from New York is now online
Security is the new bottleneck. I took the moment at the conference to talk about engineering, not AI hype.
Instead of rambling about software factories, I focused on engineering itself. By making security incident response fast, delivery gets faster too.
The answer to AI is engineering, not AI.
- The "Security take-off" is the new normal.
Attackers scan and exploit new commits automatically, so publishing code online is now unsafer. To stay secure, you'll need more inference capacity than your attackers on autonomous purple teaming. Most companies have not factored the cost of inferencing for defence into their operational budgets yet. It's going to be exorbitant.
- We don't need most libraries anymore. Libraries existed because code was hard to write. It isn't now.
I keep a trusted core (kernel, DNS, crypto). For everything above that, I have an agent build it or I vendor it.
"If you have to tool call a human on GitHub, that's not AGI."
- Hard tools are now easy to use. Patching felt hard because every project brings its own build toolchain, CI job and artifact repo, separately for each language. Nix has solved that since 2003, but it was too painful to learn.
Agents remove the learning curve. Ask for Nix (or Bazel or Buck2), and you get it, with no multi-year upskilling project that nearly got every eng leader fired because you had to convince the organization of ROI, upskill humans with a huge investment of time before payoff.
Question your old assumptions: "The language sucks, I don't care, I just want the outcome."
- One source of truth for every environment. In the talk, I show my nix-demo: a single devenv file defines developer laptops, CI/CD, agent sandboxes and production Docker images.
No need to set up a separate team for agent sandboxes that copies environments you already have. There's no drift between environments, and onboarding or replacing a lost laptop takes minutes instead of 48 hours.
It's like nvm or pyenv for every OS dependency, including native libraries reached through FFI.
Nix's dependency graph also builds leaner Docker images than stacked layers.
- Demo: a git that can't force-push. When I enter the demo environment, git goes from 2.54 to my patched 2.55, which can't force-push. To make it, I asked Claude to "use Nix and create me a custom overlay that removes force push."
It's one patch, applied everywhere: my laptops, agent sandboxes and anything that uses git as a transitive dependency. It's the old way open source was shared, back in the slackware days, as patch files, before "get it merged upstream and consume the compiled artifact" became a thing after GitHub.
Agents hill-climb toward their goal and will do destructive things to get there. The best way to stop a model from doing something is to remove the capability from the underlying system.
- Patch the planet. You don't have to wait for upstream to merge your fix. A Nix overlay can patch any package, even the kernel, and roll it out across the fleet. mise and Homebrew can't do that.
Transitive dependencies are where this matters. OpenSSL lives inside Nginx and Postgres, which is why no one used to patch it by hand. With one source of truth, Nix rebuilds everything that depends on it. CI builds once and pushes to the cache, and developers and sandboxes download from it.
When the incidents hit, I asked Claude whether my fleet was affected. It said yes, then updated the pins and applied the patches, and the rest rebuilt itself. I didn't lose any sleep.
- Notes in AGENTS.md can be used for cleanup tasks instead of Jira tickets. So I asked the agent to add a note to AGENTS.md: remove these patches in seven days.
The next agent working on that machine read the note and removed them once upstream had shipped a fix. Nobody had to remember to do it.
These two tricks, an overlay patch plus a self-expiring note, are my standard response to every security issue.
- My loop agents get sudo on disposable Nix machines, so they can inspect everything from databases to system journals. That's safe because the machine was built to be thrown away.
NixOS tests start whole fleets (web servers, load balancers, VLANs) and check the network rules. Every change is tested on infrastructure identical to production from day one, and preview environments come for free.
My hard rule: never give agents root on production hosts and never connect them to production databases. Copy the data and lock down outbound network access instead.
- Deterministic checks, not skills. Ralph was never just about loops. It was about stopping the loop from closing on bad code.
Pre-commit hooks block code that doesn't compile. Static and semantic analysis enforces architecture rules, for example the SQL layer must never reference the API layer. Checks like these replace much of the need for code review.
Unit tests only cover what you thought to test, so I use property-based testing to search for the edge cases you didn't think of.
At @AntithesisHQ we built two open-source tools for this: Bombadil, which stress-tests web apps against properties like "the user can always log out" and should replace Playwright, and Hegel, which brings Hypothesis-style property testing to every language.