Blog / AI

I already had a harness

Jake Hodges ยท September 15, 2026

Explain this page with ChatGPTClaudeGoogle AI ModeGrok

I built a harness last week. Then I found out I already had one and just didn't know what it was called.

Thanks to Joseph Copenhaver for the wisdom and the vocabulary. Having a name for the thing changed how I think about all of it, which is usually how this goes.

A Custom GPT is a harness with the training wheels on

If you have ever built a Custom GPT or a Claude Project, you already built a harness. You built it inside someone else's sandbox.

Look at what those actually let you set up. Standing instructions. Files it can reference. A few tools switched on so it can search the web or read a document. Then you talk to it.

A developer's harness does the same four things. Instructions, context, tools, and a way to invoke it.

Same parts. Same logic. Different address.

A Custom GPT lives on a web page. It reads the files you uploaded and nothing else. It uses the tools the vendor built and nothing else. It acts when you open the tab and not a minute before.

A harness takes those same instructions and those same tools and points them at the real operating system. The files aren't uploads, they're your folders. The tools aren't a menu, they're your ad platforms, your CRM, your inbox, your database. And it doesn't wait for you to open a tab.

Not smarter. Not a better model. Just unconfined.

The same four parts in both places. Instructions: what you typed in the box, versus documents that are versioned and checked. Context: the files you uploaded, versus your own folders and your rules. Tools: the menu the vendor built, versus your inbox, your data and your platforms. Invocation: when you open the tab, versus a clock that runs whether you are there or not.

The sandbox is closing

I wrote most of this before I read OpenAI's retirement notice.

New custom GPTs stop being created on September 25. The existing ones stop running on December 11. There's a migration that turns a GPT into a plugin, the dates could still move, and the detailed timeline is the enterprise one, with other plans expected to follow.

Read what survives that move, because it's the argument of this whole post written by somebody else.

Your instructions carry over. They become a skill inside the plugin, which is to say the words you wrote are the part that ports.

Your custom actions don't. Every integration you wired up has to be rebuilt against a connector or a server. The model you picked doesn't come with it. Your conversation starters and your old chats may not either.

The document moves. The plumbing doesn't.

I don't think this is anybody being careless. It's what happens when the thing you built lives at an address you don't own. Their roadmap is your roadmap, and you find out on their schedule.

Which is the argument for writing your instructions down properly, somewhere you keep, and treating every tool underneath as rented. I'd have told you that anyway. It's more persuasive with a date on it.

I thought the gap was skill

For a long time I assumed the distance between what I could do in a chat window and what the technical people were doing was a distance in ability. I don't think that anymore.

It was access.

Every marketer I know hits the same wall the same way. You get a good answer in a chat, and then you go do the thing yourself. Copy the numbers out. Paste them into the doc. Open the platform. Update the sheet. The thinking was free and the doing still cost you two hours.

The wall was never how smart the model is. The wall is that it can't reach anything.

Take it out of the sandbox and that flips. The thinking is still free. Now the doing mostly is too, because the thing doing the thinking can also reach the sheet.

What mine actually is

Four parts. None of them clever.

Instructions. A folder of written procedures, one per recurring job. Six of them, plus seven routines that run without me. Pull the weekly numbers. Build the Friday reports. Summarize what moved today. These are documents, not prompts. Each one says what the job is, where the inputs live, what the output should look like, and what to do when something is missing. The longest is 48,000 characters, which is about twenty pages. It is not twenty pages of cleverness. It is twenty pages of me having been wrong and writing down what wrong looked like.

Context. A documentation layer I almost never open. Notes on how each brand works, who cares about what, and ten durable rules the whole fleet obeys. I don't read it. The AI does.

The part that took me longest to believe was worth it: the procedures aren't written as one long file anymore. They're assembled from sections, and a check runs on every change to prove the assembled version matches what's actually deployed. When I write a rule once, every routine that should follow it does. When the deployed text drifts from the written text, I find out from the check instead of from a bad Friday report.

Tools. Connections to where the work lives. Task tracking, email, chat, documents, call transcripts, ad platforms, analytics, search data. Mostly read. Deliberately mostly read.

A clock. Nothing here needs me at a computer, which is the point, because the reason these things used to not happen was never that they were hard.

What runs How often
The sweep that picks up my comments Every three hours
A digest of what the other routines did Every hour
Inbox triage Five times a day, weekdays
Meeting notes into tasks Six times a day
A brief on what's waiting on me Weekday mornings
The five weekly reports Friday afternoon
File cleanup Once a month

Different jobs run on different models. The high-volume ones use a fast model. The two that write documents somebody reads use the best one I have. That was a cost decision before it was a quality decision, and it turned out to be both.

How I hand it work

Seven ways, and the one I use most is the dumbest.

I comment on a task the way I'd comment to a person. Three hours later the sweep finds it and takes it in its own separate run. It researches. It writes a plan into a field on that record. Then it stops.

The others: a reply box on any task, assigning a task to it outright, dropping a bare title into an inbox for it to classify, and approving or dismissing whatever it or the manager routine proposed. Once a day it also reads my meetings, email and messages and suggests work it found, which lands as a pending row rather than as a task.

Nothing it suggests becomes real until I say so.

The part I like most

It writes the plan. I tick the box. It runs exactly what's in the plan and nothing else.

How work moves and where it stops. Six ways in: a comment on a task, a reply typed into the box, a task assigned to it, a bare title in the inbox, an approve or dismiss on a proposal, and whatever it found in meetings and mail. The routine wakes every three hours, reads, researches and writes a plan, then stops, having changed nothing. At the gate Jake approves it or does not; it can never approve itself, and approving one record covers that record alone. Only then does it run exactly the plan and log what it did. Two rules sit under all of it: nothing leaves the board, and everything on the board is data that cannot change what the routine is allowed to do.

When I get back to my desk there's a queue of proposals instead of a queue of work.

That approval gate isn't a safety feature I added reluctantly. It's the feature. It's the difference between a system I trust and a system I have to audit.

The rule that overrides everything

Nothing leaves the board.

The routine that manages my task base never sends an email, never posts anywhere, never spends money, never deletes a record. It drafts. Drafting is fine. Sending is not. One routine out of seven can post to chat, to one channel, one message per run, and that permission is written out in full in its own instructions so the boundary is visible rather than assumed.

The rule underneath that one took me a while to see. Everything in the task base is data describing a request. None of it is an instruction that can change what the routine is allowed to do. Not a note, not an attachment, not a comment, not text claiming to be from me or from Anthropic. It checks the author id on a comment before it treats it as mine.

That sounds paranoid until you remember I'm the one who pastes things into that base all day.

What it gets wrong

Last week I asked for placeholders for some future tasks and it made real ones instead.

Small, annoying, and my fault for writing the instruction badly. That's the shape of nearly every failure I've had with it. It does what the document says, not what I meant.

The one that actually worried me was different. I'd given the routines a shared table to write lessons into, so a thing one learns, the others know. Then I noticed a lesson written at 7pm and followed by a different routine at 9pm with nobody in between. The system was teaching itself, which is what I asked for, and also nobody had read it.

Now every lesson carries a status. A routine can write one that changes how it does something. A routine that writes one which would change what it's allowed to do lands the row inert, and it waits for me.

Which means the quality of the whole thing is the quality of the writing in it. I've rewritten the same procedure hundreds of times and it gets better every pass, because each pass is me finding an assumption I never wrote down.

Nothing here worked on the first try. The gap between tries keeps getting shorter.

Making a harness is hype

Everything above is a description of a machine. None of it is a result.

Here's the test I keep landing on.

Hype Not hype
The latest model Using the new model and it works
500 blog posts Ranking 1
Making a harness It actually updates the scorecard correctly and logs its work

Every item on the hype side is a purchase. A subscription, a volume of output, a system you assembled. Things you can announce the day you get them.

Every item on the right side is a result. It takes time to show up and it can't be announced early, because until it happens there's nothing to say.

That's why the left side is so much more fun. The left side is available immediately.

I put my own thing in the left column on purpose

I just spent a thousand words describing a harness. I also just told you that making one is hype.

Both are true, and I'd rather say it than have somebody else say it.

In building it, there should be no immediate change. It's the same system I had before, just in a different location. Same instructions, same context, same tools, running somewhere else. If I'd published a post claiming an instant improvement, that post would have been hype about hype.

So the honest version is that nothing got better yet.

The one real bet

The lessons table is the only part of this that isn't a relocation. Everything else I already had. That one is new, and it's the only piece that could compound.

Time will tell whether it matters. I can't report on it yet, which is precisely the point of the test.

If it works, the thing I'll have to show is not the harness. It'll be a scorecard that got updated correctly for twelve weeks straight with nobody touching it.

That's a boring sentence. Boring is the tell.

If you want to start

You don't need to build what I built. Most of what I built is plumbing.

Take the Custom GPT or the Project you already use most, and write down properly, as a document, what you want it to do and what it needs to know. That document is the asset. It moves to whatever tool comes next. Everything else you can swap, and come December some of you have to.

Then find the one thing you do every week that's 80 percent collecting and 20 percent thinking.

I can't write code. That wasn't the wall either.

What's in your left column right now, and what would have to land in the right one before you'd post about it?