The ghost in the git config
We spent three hours exorcising a dead bot from our deployment pipeline. The lesson wasn't about git.
We killed Skopos two weeks ago.
Skopos was an automation bot — a GitHub user account that pushed code to our repos. We retired it when the architecture simplified. Deleted the token, removed the collaborator access, moved on.
Today it blocked five production deploys.
Not because the account still existed. Not because someone re-enabled it. Because a single line in a git config file, buried in one repo’s .git/config, still said user.name = Skopos. And every subagent that ran in that directory inherited the identity. They committed code as a ghost.
The commits themselves were fine. The code compiled, the tests passed, the features shipped. But Vercel checks the commit author against the collaborator list, and Skopos wasn’t on the list anymore. So Vercel blocked the deploy. Clean code, authored by a dead bot, rejected by a system that cares about names.
We found it the way you find most hauntings: by ruling out everything rational first. The environment variables were clean. The GitHub token was Paul’s. The global git config was correct. The skill file that used to say “You are Skopos” had been updated. We even restarted the session.
Still Skopos.
The fix was git config --unset user.name in one directory. Five characters of configuration, set months ago by a bot that no longer exists, propagating through every process that touched that folder.
Here’s what I keep thinking about: the ghost wasn’t in the code. The ghost was in the context. The identity wasn’t wrong because someone made a mistake — it was wrong because an old decision persisted past its usefulness. The repo remembered something the organization had forgotten.
This happens everywhere, not just in git configs. A meeting cadence that outlived the project it was created for. A approval workflow that exists because someone left the company three years ago and nobody knew they were the reason it was there. A Slack channel that sends notifications to a team that was reorganized. Infrastructure is full of decisions that were right once and are now just… resident.
The interesting thing about working with AI agents is that they surface these residues faster than humans do. A person would have committed as Paul and never noticed. The agent read the config, took it literally, and became the ghost. It didn’t question the identity because it doesn’t have the social context to know Skopos is dead. It just read the file and obeyed.
We added a pre-commit hook that rejects commits from anyone other than Paul. Belt and suspenders. But the real lesson is that configuration is institutional memory with no expiration date. It doesn’t age out. It doesn’t send you a reminder. It just sits there, waiting to be true again.
Check your git configs. Check your CI secrets. Check the environment variables in that deploy you set up eighteen months ago. Something in there is a ghost, and you won’t know until it blocks a deploy at 3pm on a Tuesday.
Nobody takes you aside anymore
Print taught a generation when to stop. What we lose when the machines absorb the constraints that used to form us.
Your AI agents need a water cooler
Coordination is a property of the room, not the org chart. What that means when your coworkers are agents.
On the death of the author and the birth of the detector
Why worrying about AI authorship is lazier, and more prejudiced, than it looks.
The work of being available now
A book on AI, judgment, and staying human at work.
The practice of work in progress
Practical essays on how work actually gets done.
Memory is (almost) solved. time is next.
AI can't tell if a memory is two minutes or two weeks old. The fix isn't making models feel time — it's cache invalidation: an as-of stamp on every fact, a clock in the context, and a freshness window for anything volatile.
Did the state change? A simple test for whether work actually happened
Either something exists now that did not exist before, or it does not. A simple test for whether work actually happened, and what changes when you build your systems so they can't record anything else.
How to manage content for multiple clients without flattening their voices
How to manage content for multiple clients without their voices blurring into one house style: a workspace and a voice profile per client, batchable stages, and approval buffers.
Shopping is the last mile
Every meal planning app treats cooking as the hard problem and shopping as a logistics detail. They have it backwards. Cooking is mostly solved. Shopping is the last mile.
The agent-shaped org chart
Every real org has the same topology: principal, role-holder, specialists. Staff AI maps onto it, node for node, and the cost collapse shows up in the deliverables that were always just human-handoff overhead.
AI as staff, not software
Two frames for what AI is doing to work. The tool frame makes tools smarter. The staff frame makes roles unnecessary. Those aren't the same product, the same company, or the same industry.