Blog / AI

I already had a harness

Jake Hodges ยท September 23, 2026

Explain this page with ChatGPTClaudeGoogle AI ModeGrok

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

Thanks to Joseph Copenhaver for the wisdom and the vocabulary. A name for the thing changed how I think about all of it, and that happens to me a lot.

A Custom GPT is a harness with the training wheels on

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

Look at what those let you set up: standing instructions, files it can reference, and a few tools switched on so it can search the web or read a document. Then you talk to it.

A developer's harness has the same four parts: instructions, context, tools, and a way to start it. The logic matches too. Only the address changes.

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

A harness takes those same instructions and tools and points them at your real systems. The files are your folders. The tools are your ad platforms, your CRM, your inbox and your database. And it runs on a schedule, whether you open a tab or not.

You get the same model with more reach.

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.

OpenAI stops new custom GPTs on September 25 and turns the existing ones off on December 11. It offers 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.

The migration makes this post's argument better than I could.

Your instructions carry over as a skill inside the plugin, so the words you wrote are the part that ports.

Your custom actions don't carry over. You rebuild each integration against a connector or a server. The model you picked stays behind, and your conversation starters and old chats may not make it either.

You keep the document and lose the plumbing.

I don't blame OpenAI for this. You built at an address you don't own, so you follow their roadmap and learn about changes on their schedule.

That's the case for writing your instructions down in a document you keep, and treating every tool underneath as rented. I'd have told you that anyway. A date on it makes the case harder to ignore.

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 did came down to ability. I don't think that anymore. It came down to access.

The marketers I know hit the same wall. You get a good answer in a chat, then you go do the work yourself: copy the numbers out, paste them into the doc, open the platform, update the sheet. The thinking cost nothing and the doing still cost you two hours.

The model was smart enough all along. It couldn't reach anything.

Take it out of the sandbox and the math flips. The thinking stays free, and most of the doing gets free too, because the thing doing the thinking can reach the sheet.

What mine is

It has four parts, and none of them is clever.

Instructions. A folder of written procedures, one per recurring job. I have six, plus twelve routines that run without me. They pull the weekly numbers and build the Friday reports. I write each one like an SOP: what the job is, where the inputs live, what the output should look like, and what to do when something is missing. The longest runs 55,000 characters, about twenty-three pages, and most of those pages record me being wrong and writing down what wrong looked like.

Context. A documentation layer I don't open much. It holds notes on how each brand works, who cares about what, and ten rules the whole fleet follows. The AI reads it so I don't have to.

The part that took me longest to value: I no longer keep the procedures as one long file. A script assembles them from sections, and a check runs on each change to prove the assembled version matches what's deployed. I write a rule once and each routine that should follow it picks it up. If the deployed text drifts from the written text, the check tells me before a bad Friday report does.

Tools. Connections to where the work lives: task tracking, email, chat, documents, call transcripts, ad platforms, analytics and search data. I gave the routines read access to almost all of it, on purpose.

A clock. None of this needs me at a computer, and needing me at a computer was the only thing stopping most of it before.

What runs How often
The sweep that picks up my comments Every three hours
A digest of what the other routines did Hourly through the working day
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
Tidying up the knowledge base Weekday mornings
Filling the content calendar Twice a week
Checking whether my own rules still hold Thursdays
The weekly numbers Monday mornings
The five weekly reports Friday afternoon
Replies to email sent to my AI Hourly through the working day
File cleanup Once a month

Different jobs run on different models. The high-volume ones use a fast model, and the ones that write documents somebody reads use the best one I have. I picked that split for cost, and it paid off in quality as well.

The whole system on one page, in four parts around one board. The rulebook at the top: change one rule and a script builds it into each routine that uses it, pushes the text word for word, and checks for drift after. The board is where tasks, proposals and lessons wait, and where Jake comments and approves. Twelve routines on a clock read and write the board, and meeting triage turns calls into tasks. The routines look things up in one shared memory: decisions, meetings, notes, and ad and social numbers pulled nightly. Every plan still stops for Jake, and one routine may now send replies to people he already knows, in their own thread.

How I hand it work

I have seven ways to hand it work, and I use the dumbest one most.

I comment on a task the way I'd comment to a person. Within three hours the sweep finds the comment and handles it in its own run. It researches and writes a plan into a field on that record, then stops.

The other six: a reply box on any task, assigning a task to it outright, dropping one into the queue for it to file, dropping a bare title into an inbox for it to classify, and a tick on something it or the manager routine proposed. Once a day it also reads my meetings, email and messages and turns what it finds into pending rows, which stay pending until I say so.

The part I like most

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

How work moves and where it stops. Seven ways in: a comment on a task, a reply typed into the box, a task assigned to it, a task dropped in the queue, a bare title in the inbox, a tick on something it proposed, and a tick on something the manager routine proposed. 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 the approved 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.

I come back to my desk to a queue of proposals instead of a queue of work. I review each plan before it runs, which saves me auditing the results after.

The rule that overrides everything

Nothing leaves the board.

The routine that manages my task base doesn't send email, post anywhere, spend money or delete records. It drafts, and I send. One routine out of twelve can post to chat: one channel, one message per run, with that permission written out in full in its own instructions so I can see the boundary.

The rule underneath that one took me a while to see. The routine treats everything in the task base as data describing a request, and none of it can change what the routine may do. That covers notes, attachments and comments, including text that claims to come from me or from Anthropic. It checks the author id on a comment before it treats the comment as mine.

That sounds paranoid until you remember I paste things into that base all day.

This week I made a second exception, and the first one that sends email. One routine answers mail people write to my AI's own address. It replies inside the thread they started, only to people on my team or people I've emailed myself, and only with facts I've written down for it. Anything with a date or a commitment gets a holding reply and comes to me. If someone says they'd rather not hear from an AI, it says so once and stops for good.

I allowed it because I check it myself, by hand.

What it gets wrong

Last week I asked for placeholders for some future tasks and it made real ones instead. That was small, annoying, and my fault for writing a vague instruction. Most of my failures with it look like that: it does what the document says instead of what I meant.

The one that worried me was different. I gave the routines a shared table for lessons, so what one learns the others know. Then I found a lesson one routine wrote at 7pm that a different routine followed at 9pm, with nobody reading it in between. The system taught itself, as I'd asked, and I hadn't read the lesson.

Now each lesson carries a status. A routine can write a lesson that changes how it does something. If a lesson would change what a routine is allowed to do, it lands switched off and waits for me.

The quality of the whole thing comes down to the quality of the writing in it. I've rewritten the same procedure hundreds of times, and each pass improves it because I find an assumption I never wrote down.

None of it worked on the first try, and the gap between tries keeps shrinking.

Making a harness is hype

Everything above describes a machine. None of it describes a result.

I keep coming back to this test.

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

The hype side lists things you buy or assemble: a subscription, a pile of output, a system. You can announce them the day you get them.

The other side lists results. They take time to show up, and you can't announce them early, because until they happen you have nothing to say.

That makes the left side more fun. You can have it today.

I put my own thing in the left column on purpose

I've spent most of this post describing a harness, and I've told you that making one is hype. Both are true, and I'd rather say it myself than hear it from somebody else.

Building it shouldn't change anything right away. It's the same system I had, running in a different place with the same instructions, context and tools. A post claiming an instant improvement would have been hype about hype.

Nothing has improved yet.

A few days ago I caught myself failing my own test. I told somebody the new setup feels like it uses less, and feeling that way doesn't make it true. I maxed out my plan building the thing and the first runs were heavy. Outside of code sessions I can't see token usage, so I watch how long each run takes and call that a measurement. That belongs in the left column too.

Since then I've added five more routines. The right column is still empty.

The one real bet

The lessons table is the only part of this I didn't have before, and the only piece that could compound.

Two things happened that I didn't expect.

It suggested ten tasks for itself, and nine of them were ideas I'd been carrying in my head without writing down.

It also rejects most of the changes it proposes to its own instructions. I read each change line by line, anything beyond trivial waits for me, and a separate routine watches for drift and bias. I worried it would talk itself into more room. So far it talks itself out of it more often than not.

One warning stuck with me: anything that feeds back into itself builds a bias over time and loses the ability to correct it. A routine now runs on Thursdays that checks whether what the others rely on still holds. It checks whether they're hitting the objectives, whether the evidence under each rule still stands, and whether an approach I'm not using beats the one I am.

It audits the lessons. It's a week old, so ask me in a month.

Two weeks of surprises don't count as evidence. I can't report the result that matters yet, which is the point of the test.

If it works, the proof will be a dull sentence: a scorecard that updated correctly for twelve weeks straight without anyone touching it.

What it's for

Somebody asked me last week, no fluff, whether it was worth it compared to where I was.

None of the above is the reason. I don't talk about this part, and it matters most to me. I don't take meeting notes anymore, I don't remember a task at eleven at night, and I don't do the same thing by hand every Friday.

I got back more than time. The work I want to do is now the work I do, and the nice-to-haves that sat on a list for a year get done too.

I'd build the whole thing again for what I learned. If every AI tool shut off tomorrow, I'd keep the habit, and it applies to far more than this.

If you want to start

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

Take the Custom GPT or Project you use most and write down, as a document, what you want it to do and what it needs to know. That document is the asset. You can carry it to the next tool and swap everything else, and come December some of you will have to.

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

I can't write code, and that wasn't the wall either.

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