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.
Why customer tools are organized wrong
This article reveals a fundamental flaw in how customer support tools are designed—organizing by interaction type instead of by customer—and explains why this fragmentation wastes time and obscures the full picture you need to help users effectively.
Infrastructure shapes thought
The tools you build determine what kinds of thinking become possible. On infrastructure, friction, and building deliberately for thought rather than just throughput.
Server-side dashboard architecture: Why moving data fetching off the browser changes everything
How choosing server-side rendering solved security, CORS, and credential management problems I didn't know I had.
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.
The day the fleet shipped everything
One session. Three products. Seventy-plus features. What happens when you stop planning and start dispatching.
Knowledge work was never work
Knowledge work was always coordination between humans who couldn't share state directly. The artifacts were never the work. They were the overhead — and AI just made the overhead optional.
Context as facticity: stigmergic and ontological perspectives on AI agent coordination
The AI multi-agent coordination literature is doing analytic philosophy without knowing it. Continental philosophy — Heidegger's facticity, Gadamer's fusion of horizons — explains why a chat channel works better than a constitutional framework. The answer involves digital pheromones and the fact that AI agents have facticity too.
Knowledge work was never work
Knowledge work was always coordination between humans who couldn't share state directly. The artifacts were never the work. They were the overhead — and AI just made the overhead optional.
The costume just got cheap
If 80 percent of what you thought was judgment turns out to be pattern recognition, what does that say about you? Not about your job — about you.
AI and the Götterdämmerung of Work
Work is dead. And we have killed it. AI didn't defeat the myth that human value comes from reliable output — we built the systems that exposed it. What comes next isn't replacement. It's revaluation.