9 minute read

A stranger on Reddit read my post about measuring my team before and after agents and opened their reply with this:

Did you write the article? Because it reads like LLM output.

Claude typed it. I tell people this as loudly as a blog allows: on the About page, in the first paragraph, occasionally twice. People still discover it on their own and bring me the news, like they’ve found my diary.

At this point I feel like a clown in a business suit, standing on a street corner holding a sign. Here is the sign. It has its own heading, so I can link to it.

Get a load of this: nothing is real

A grinning clown with an orange afro, red nose and a navy business suit stands in the middle of a sunny, busy street, holding up a sign covered in sparkles that says "AI content!" Everyone around him is chatting, drinking coffee and walking their dog, and nobody is looking at the sign.

To be clear: nothing you read on this blog was typed by a human. It was typed by an LLM, guided by a human.

The murder mystery: Who wrote this?

Fairly recently, a former colleague posted this on LinkedIn:

I started writing this weekend. I have ideas, but I also have a full time job. So I use the tools available to me, including Claude. It’s my ideas, my perspective and my angle, but it is put together by AI. Would you say it’s: A. Written by me B. Written by me and AI-assisted C. Written by AI?

Her setup is my setup, and her three options all mix up two questions: whose thinking is it, and whose sentences are they?

My answer is D:

  1. my name,
  2. my responsibility,
  3. my thinking,
  4. Claude’s typing.

Bear with me, the following might now sound unrelated. Git, most software engineers’ tool of choice to manage code base complexity over time (a so-called “version control system”), also keeps track of authorship of every line of code. The command is called git blame, and it will practically tell you who to throw a rotten egg at if a change messed something up (I’m slightly exaggerating, we’ve long learned to stop throwing rotten eggs. Most of us have, that is). I’ll come back to it.

D is easier to show than to explain, so here is how this post got made. It gave the stranger three different answers before it found the right one.

The scene of the crime (the repo)

This blog is a git repository too, with three extra files for the agent:

  • AGENTS.md, which Claude Code reads first. It explains the repo and points to the guide.
  • agents/WRITING-GUIDE.md, the house rules.
  • notes/, one file per post with facts, sources and decisions.

The guide is mostly a log of reverts I got tired of doing by hand. Its best-known entry bans em dashes, because “the AI co-author defaults to em dashes like a moth defaults to light.” Claude typed that sentence about itself. It seems fine with it.

Every post starts with Claude reading the repo and explaining our process back to me. Then I tell it what I want to write, and it asks for what it can’t know: here, the exact comment, my colleague’s post, and how much of the writing is actually me.

Four rounds of conversation, then a draft. The thinking happens in the conversation; the drafts show me what I haven’t said clearly yet.

“Yes” (I shot the sheriff)

So, as I sat down to write a post about “how the sausage is made”, the first draft answered the stranger’s question (“did you write the article [yourself]?”) like this:

Yes. An LLM wrote most of the sentences.

Most. I had told Claude the wording was “often” its own, and it rounded to whichever number was least likely to get anyone in trouble. My reply:

you will write all of the sentences, so say that you wrote all of them is true.

Lesson one: left alone, the draft makes you sound like you’re giving evidence to a committee. If you meant “all,” check that it still says “all.”

Lesson two is worse. When the draft needs a scene you didn’t give it, it builds one. A July draft had a friend ask me something “over drinks.” I was herding my kids, and the friend was a her. A hiring post had me sit through four interviews “saying nothing,” a bold way to run an interview; I asked questions the whole time. Both versions read better than the truth. Neither happened. Both got reverted, and the guide gained a line: “Never invent scene details about real people or events. If the story needs a detail we don’t have, ask the author.”

“No. Claude did.” (And I also shot the deputy)

Draft two had a better answer:

No. Claude did.

It also had a new title, because of what I’d said about the first one:

I don’t like the title, because it doesn’t tell what this article is about.

Somewhere in it, Claude had written: “That bar is also what keeps the next section in check.” I wrote back:

either it’s a bar that has to be passed or it’s something entirely else, but it’s exactly the kind of pattern that reads plausible but doesn’t create images in reader’s heads.

Try to picture it. A bar, keeping a section in check. It has the shape of a thought, the confidence of a thought, and nothing inside. Drafts are full of these. My test: what do I see? If the answer is nothing, it goes.

The easy tells are words like “delve,” and you can search for words. The rest is rhythm: bold one-line verdicts, everything in threes, closing lines made for a mug. One is fine. Five in a row and readers notice, the way you notice air freshener in a flat that was a mess an hour ago. Reading the post aloud catches most of them.

“Claude typed it.” (I swear it was in self-defense!)

Draft three read cleanly and still felt off. I told Claude:

I feel like the text is often arguing with itself.

It found nine places. The opening answered the stranger with “No,” and the next section explained that yes or no was the wrong question. Almost every claim came with a counterweight, like a draft that wanted to be agreed with by everyone, itself included.

Git has a name for this: a merge conflict. Two versions of the same line, both insisting on staying. Usually one of them is wrong, and some of the nine were simply that. Others were two true things standing too close together. For those, code editors have a button labelled “Accept Both Changes.” I put it like this:

The challenge here is that sometimes opposites can both be true.

Claude writes every sentence. I decide every sentence: what to say, what’s wrong, what to cut, which opinion is mine and which one it made up for me. Even the corrections were typed by Claude. I point at a sentence, say what’s wrong, and read the next version. I call that editing. If you’ve only ever edited by typing over someone else’s words, it sounds like I’m describing a contradiction. I’m describing a job.

The opening became “Claude typed it.” It has stayed that way since.

Draft four was 1,900 words. I asked it to “cut the fluff” and “get out of the average.” Draft five came back at 1,150 words, read well, and had lost half of what it was about. My verdict: “This one has readability, the other has the content.” Draft six merged the two without a single conflict, and I found it “a bit too clinical.” Draft seven was allowed to have a personality. You’re reading way past draft eight, which also borrowed git’s vocabulary. It also contains a few manual edits of mine.

Good enough (if I am guilty, I will pay)

I stop at good enough. (Note: I’m saying “good enough”, not “perfect”, because “perfect” is the enemy of “good enough”.)

Good enough means true. The voice isn’t fully mine, and some sentences could be better. I can live with that. I can’t live with a sentence that’s wrong, a version of me that didn’t happen, or an opinion I don’t hold. When those are gone, I commit and push. Pushing publishes. Claude doesn’t get to do that, and has taken it well.

The body count

Every murder mystery has a body count. Mine is in words. Up to draft five, the conversation behind this post looked like this:

$ git shortlog --words     # not a real flag, sadly
  19,500  Claude
   1,500  Bernd

My column doesn’t count what I pasted in. About 1,600 of Claude’s words made it into what you’re reading. Mine all went into choosing which. Git calls that cherry-picking. So, I suspect, would the stranger.

The motive (Why bother?)

I have a full-time job and a family. Without this, most of these posts would sit in a stash I never pop, apart from one mention over lunch to people who didn’t ask.

It also gets me further than my spare time would. I wrote about AI and mathematics, a field where I had to look up the word “conjecture.” Claude did the reading, and I asked questions until I could follow. Alone, I would have given up at the first paper, possibly at its title.

And I get someone to disagree with, which I do often. Working out why it’s wrong is how I find out what I think.

The one that got away

Writing is cheap now. I could push a post every day. Nobody has asked me to, and the internet seems to be coping. What keeps it from turning into slop are the two tests above: is it true, and what do I see?

Readers who think I’m hiding the authorship are a harder problem. Once someone thinks they’ve caught me, they stop reading the argument and start reading for evidence. Saying it up front hasn’t been enough, so now it has a post of its own, which I expect to link a lot.

One cost has no catch at all. Writing the math post, I understood things I couldn’t have reached alone. But I once wrote about the intern that standing next to someone fluent gives you the warm glow of being fluent yourself, and that glow feels exactly like understanding. Sometimes I can’t tell which one I have. I’d ask Claude, but it thinks I understand everything.

So, did I write this? (Who knows?)

Back to git blame, as promised. The stranger ran it too, implicitly by reading the article: something read badly, so they asked who wrote it. Run the real one on this post and every line says Bernd Kampl.

That’s deliberate. Claude gets the credit on the sign up top, and the blame stays down here with me. That’s D, in git.

If it reads like an LLM, that’s by its nature and I accept that. If it reads boring or unentertaining, that’s worse. We’re currently still in the “uncanny valley of text creation”, and only by “walking the walk” can I learn how to push the limits.

This last line was added by a human, just so I can say “sure I wrote this”. (You’ll never know if that’s true or not. Oh the irony.)

Updated:

Comments