×

👋 Hello, Anthropic team!

Thanks for checking out my blog. I'm excited about the opportunity to work with you on building safe, beneficial AI systems.

Feel free to explore the posts on AI alignment, verification theory, and software engineering.

— James

Latest Posts

Why Alignment Verification Might Be Fundamentally Broken

We've known since 1936 that universal verification is impossible. Now we're trying it on AI systems that adapt to detection.

For any detector f, it is possible to construct a program g that can bypass or defeat it. Any alignment test becomes a signal that says, "Humans are watching."

The Layers of Abstraction Will Kill You

Two long hours to debug a simple "command not found."

The actual problem was buried four dependencies deep: an image library couldn't build native bindings for my specific Node + ARM combo. When it failed, npm silently rolled back the entire install while reporting success.

Every abstraction layer you add is another place errors get swallowed. The fix took 30 seconds once I found it. The ablest developers aren't those who know the most tools, but the ones who deftly drop down a layer when something breaks.

Know what's under your abstractions.

I Made a Lightweight Git Worktree Manager (Because I Couldn't Find One)

I built a git worktree manager because I couldn't find a simple one.

The problem hit me when running multiple AI coding agents at once—one was refactoring accessibility code while I needed to review the current implementation for a bug. Same files, different contexts. I couldn't commit the half-done work, couldn't stash and lose the agent's state, couldn't review without a clean checkout.

Git worktrees solved this, but the syntax was awkward. Branchyard exists and is great if you want VS Code integration and git hooks, but I wanted something I could drop in my dotfiles and understand in 20 minutes.

So I built gwt (git-worktree-utils): • bash, zero dependencies • Source-based, lives in ~/.config • One branch = one directory (keeps the mental model simple) • Built-in cleanup for orphaned directories

Use cases beyond AI agents: • Code review without losing your place • Emergency hotfixes without stashing • Running tests in one branch while coding in another

The pattern works: multiple branches in separate directories beats constant switching. No stashing, IDE state persists, contexts stay separate.

Project: https://github.com/jamesfishwick/git-worktree-utils

Let the System Remember: Multiple Git Accounts

Spent an hour reverse-engineering my own Git multi-account setup. 🙃 It turns out that the "hacky" approach—using SSH host aliases with fake hostnames—works better than the "correct" one. Why? Loud failure beats silent failure, and state beats process. Every "just remember to..." is a bug.

Syntax, Struggle, and Expertise

For decades, the path to programming expertise ran through syntax struggle—writing, breaking, debugging, repeat. LLMs just eliminated that grind. Junior devs now learn by reviewing AI-generated code instead of writing from scratch.

View more posts in the archive →