
Why I started building GAP
I’ve had the same dream for a long time, which is the Star Trek computer. Talk to it. Get answers back. Have it help me do things faster and better. GAP came out of chasing that, just a lot slower and messier than the show makes it look.
I started way back with text-to-speech, then speech-to-text, because I wanted to actually talk to an agent and have it understand the context of what I was asking. Then I ran into the next wall, which was memory. My preferences for how I code, how I operate, how I do things, it never seemed to remember any of it. So I went down the persistent memory path to fix that.
Once I started finding methods and building my own solutions, I hit the thing that really broke me. Every bug, every new feature, every new project, I had to redo this whole grand onboarding. I’d have to teach the agent the project, what the spec is, all the little nuances, and then do it all over again next time. That’s why GAP exists.
There’s a bigger pattern I keep seeing too. All the hype in AI keeps coming full circle back to regular programming ideas, stuff basic computer science already figured out. I think a lot of it is people wanting to make a splash, so they reinvent the wheel, and their wheel comes out a little hexagonal with lots of rough spots. Everybody’s got opinions now on how agents should code, what the output should look like, and how you push to production, and none of it is really different from what we had before. I just want the part where I say what I want once and it sticks.
I started thinking about it like a company. A company has a global policy, how it conducts itself and how it builds its products. There’s a certain expectation, a certain demeanor, a certain process, and a certain outcome it needs to operate. Then there are local policies. In a company with a bunch of services, or an agency, every project and every new feature is a little different from the last, with its own expectations and its own definition of done. Every time I hit that, I had to reset and think about it like I was onboarding a brand new person to the team. Every single time. It’s mundane, slow, repetitive, and irritating.
GAP stands for Global Agent Policies, and it’s both levels. It’s a small Go tool, and honestly it’s just a way to manage how my agents behave. I write the global policy once, my preferences and how I work, and gap sync copies it into the file each coding agent already reads. Claude reads its file, Codex reads its own, Cursor reads its own, Empryo reads its own, and they all get the same stuff from one place. That covers how I like things done, my slash commands, and which skill sets and tools are pinned so everybody’s on the same version. It only publishes what’s already merged, and it never installs an agent for you. The point is the agent doesn’t have to absorb a pile of context at the start of every session.
GAP doesn’t remember things for me. That’s Recall’s job. Recall gives the agent the big picture, and GAP installs Recall and points agents to it when they need the detail. GAP doesn’t set goals or run tests either. What it does carry is my habits for how I work, so I don’t have to reteach them every time.
Then there’s the local side, which is the onboarding part. Each project’s own AGENTS.md holds the spec, the nuances, what that project needs. The nearest project AGENTS.md wins, so a project’s local rules beat mine when they clash. gap init just adds a short pointer to the project’s AGENTS.md and leaves the rest alone. Every harness already splits your global preferences from the project’s local rules. They just each keep the global part in a different place, and GAP gives them all one source.
It didn’t start out this simple. Back in February I set the repo up as my own personal config, built on Daniel Miessler’s PAI. Through the summer it turned into a big setup with separate rules for each harness. In August the skills moved out to their own repo. Late September I got the first version working that published shared rules to all the harnesses at once. Then in October I rewrote it in Go as the gap command and finally named it Global Agent Policies.
Now when I hit a bug or start something new, I don’t sit down and onboard an agent from scratch. I sync GAP, point it at the project’s spec, and get to work. Still not the Star Trek computer. But it’s closer.