Keep your repos harness agnostic
I use four AI harnesses in a normal week. An IDE with fast file navigation when I’m exploring, one CLI for personal projects, a desktop app for work, and occasionally a fourth when I want a second opinion on the same repo.
That’s not a recommendation, it’s just the situation. And it has one consequence: anything I set up inside one of them is invisible to the other three. A saved session memory, a skill in some platform’s format, a per-tool config file. All of it disappears the moment I open the same folder somewhere else.
So the rule I work by is simple. Only real files in the repo are shared between harnesses. Everything else is a convenience I’m renting.
What I open the folder in
- An IDE
- A CLI
- A desktop app
- Whatever ships next month
The repository
- skills/, one Markdown file per procedure
- AGENTS.md, with CLAUDE.md symlinked to it
- Decisions and conventions, written down
What each of them gets
- The same procedures
- The same conventions
- On day one, with no setup
Three things follow from that.
A file in the repoShared
- Every harness reads it
- It survives a new tool arriving
- It is in the diff, so it gets reviewed
- You can read it yourself in six months
Anything inside a harnessRented
- A saved session memory
- A skill in that platform's format
- A per-tool config file
- MCP servers and their credentials
Only real files are shared between harnesses, so
three rules
1. Skills are plain Markdown, not a platform format
A skill here is just a procedure: how to import a bank export, how to publish a post, how to run a translation. Every serious harness now has its own format for these, and they’re all different.
Writing them in one vendor’s format gets you autocomplete and costs you portability. So I use a dumber version: one Markdown file per procedure, in a skills/ folder in the repo.
skills/
transaction_import_skill.md
linkedin_post_skill.md
video_editing_skill.mdThen I list them in the instructions file with a path and one line on when to use them:
| Skill | Use when |
|---|---|
skills/transaction_import_skill.md | integrating a bank export into the ledger |
skills/linkedin_post_skill.md | turning an idea or a source into a publishable post |
Any agent, in any tool, can read that table, open the file it needs, and follow it. There’s no runtime and nothing to register. When a new harness shows up, it works on day one.
2. One instructions file, symlinked
AGENTS.md is becoming the convention, and several tools read it directly. One of the tools I use looks for CLAUDE.md instead.
That’s one ln -s away from not being a problem:
ln -s AGENTS.md CLAUDE.mdNow there’s one file, four readers, and one rule written at the top of it: only AGENTS.md gets edited. The symlink follows on its own.
What tools look for
- AGENTS.md, directly
- CLAUDE.md, and nothing else
- AGENTS.md, but only if CLAUDE.md is missing
One file on disk
- AGENTS.md is the file
- CLAUDE.md is a symlink to it
- Only AGENTS.md is ever edited
What it prevents
- Two files drifting apart
- Two agents, two conventions
- A rule updated in one of them
What this avoids isn’t dramatic, which is why it’s worth doing. Two instruction files drift apart over a few weeks, and you end up with two agents confidently following two different conventions in the same repo.
3. Assume no memory survives the session
Every harness has some form of persistent memory and none of them share it. So anything that matters, I write down as a file: decisions in a log, conventions in the instructions, procedures in a skill.
This sounds like extra work. In practice it’s the same work done once instead of four times, and it had a side effect I didn’t expect. Things written for an agent to read turn out to be things I can read six months later. My own notes got better because I started writing them for a reader with no context at all.
The part I haven’t solved: MCP servers
Every harness needs its MCP connections set up separately. Same servers, same credentials, four setups, and they drift apart.
It’s also wasteful in a way that shows up in the bill. One analytics server I use exposes 275 tools. Every one of those definitions, with its description and schema, takes up context on every request, and I call maybe four of them.
One MCP server, on every requestbefore I have asked anything
- 275 tool definitionsEach with its description and its payload schema
- The four I actually callAlready counted above. Drawn to scale.
- Left for your actual work
My guess at where this goes: a single MCP server you connect once in every harness, which then manages which sub-servers and which subset of their tools get exposed per project. Something like Cloudflare’s code mode would help here, replacing a flood of tool definitions with a small interface the model calls programmatically. It would also fix a second annoyance, which is running the same server against different accounts depending on the project.
If someone has already solved this, I’d like to know. It’s the last piece of my setup that’s still tool-shaped instead of file-shaped.

