Why my agents browse the web with a real mouse

There is an inexpensive mini PC in my closet, bought used off eBay, with no monitor attached. Well, there is a dummy display plug, so Windows believes a 4K monitor is attached. Chrome is open. One window, maximized. The machine never locks and never sleeps. Nobody has sat at it in weeks.

Every agent I run borrows that Chrome: Claude Code on my laptop, Codex in a VM, a loop in another VM. They all get the same browser_* tools through a LiteLLM gateway and–with the patience of beings that do not experience time–wait their turn. When a site insists on talking to the human, my phone buzzes with a Delta Chat message. I VNC into the box, click the squares with the traffic lights, and the agent carries on where it left off.

The agents never find out. To them it is a browser tool, same as any other. So let’s follow one click, from the agent all the way down to the page.

Before you get the wrong idea: the mouse is “real” to Chrome the way shadows on Plato’s cave wall are real. If you came for the Stuff Made Here version with servos and a 3D-printed hand, I am sorry.

Continue Reading

We need a new unit of work for AI

Epistemic status: speculative.

The pull request (PR) is the unit of work for much of the software industry. Sure, some shops allow multiple PRs per story card, but generally speaking 1 card ≈ 1 PR ≈ the smallest change you can ship.

If you weren’t in the industry before the pull request was invented, you might not know that the unit of work has varied over the years. Some teams experimented with an even more granular unit: the commit.1 More commonly, the unit of work was much larger.2

A horizontal scale of units of work ordered by size: commit, pull request, a highlighted question mark for the new unit, and release

The more I work with AI, the more convinced I become that a change is due. It is not that the PR can’t be used in a world of AI. Rather it is that a PR is a human-centric unit of work. For as long as we stick with the PR as the unit of work, we will be leveraging only a fraction of the power of agents.

Continue Reading

Putting Pangram to the test

While catching up on Armin Ronacher’s blog, I ran across this observation about running his writing experiment through an AI detector:

Well this text too comes back as 100% slop. And it does not surprise me all that much. I have generally noticed that if you rely on an LLM to give your text structure, it will score badly on Pangram even if you do plenty of edits over it. In fact, it’s quite unlikely you’re going to get a post that starts out as slop into a structure that will make it appear that it’s not.

By interesting coincidence, I recently authored three posts (1, 2, 3) that take the converse approach: the ideas and the structure all come from me, then I liberally use the LLM to fill in that structure.

I had never used Pangram before, but this was too good an opportunity not to try it. The results weren’t too far off from what I expected, but the details surprised me all the same:

Pangram result: AI Detected, 2,565 words scanned, 16% of this text is AI, AI-generated content appears in scattered patches Pangram result: Human Written, 3,923 words scanned, 100% of this text is human written

Continue Reading

In praise of the single-threaded agent loop

An incomplete list of things I don’t get about graph engineering:

Continue Reading

Your agents have outgrown plan mode

When factories first got electricity, they did the obvious thing: unbolted the steam engine and bolted a giant electric motor in its place. Same central drive shaft, same belts, same layout. Productivity barely moved for thirty years.

Then someone realized electricity didn’t want to be one big motor–it wanted to be a small motor on every machine. Factories got rebuilt around that idea, and output exploded.

Plan mode is the giant motor bolted where the steam engine used to be.

Continue Reading