# A harness that builds the business
Hi, I’m Kai 👋 I run a marketing consultancy and an SEO SaaS, and I build both with a stack of Claude Code, Codex, and DeepSeek agents that write the tooling the next agents use. These are the field notes: what I actually run, why it ended up shaped like that, and what parts broke first. I'm here to help you grow, no matter if you're getting started building your AI stack, polishing a project, or building your business with AI. <a href="/call/">Book a call</a> if you’d like some advice, help, or consulting.

## Pages

- [Field notes](/notes/index.md)
- [Token spend](/tokens/index.md)
- [Talks](/talks/index.md)
- [Book a call](/call/index.md)
- [What I'm working on now](/now/index.md)

## Nineteen things I run every day

Each one is written up so you can take the idea without taking the dependency.

- [Route cheap first: how kaibot picks a model](/notes/route-cheap-first/index.md): Every task an agent takes on can run on a frontier model. Most shouldn’t. The ladder I run sends each task to the cheapest lane that fits, and a checklist keeps me from reaching for the expensive model out of habit.
- [Five Claudes, one repo: how kaibot runs concurrent Claude Code sessions](/notes/five-claudes-one-repo/index.md): I run five, sometimes ten, Claude Code sessions against the same kaibot repo at once. Left alone, that setup silently loses data. One worktree per session, a merge-back discipline and guard hooks make collisions physically impossible instead of just against the rules.
- [Second opinions from rival models](/notes/second-opinions/index.md): A model reviewing its own work has blind spots that match its own training. I run every change that would be expensive to get wrong past a panel of rival vendors instead, because the disagreement between labs is a signal one reviewer can never produce on itself.
- [Physics, not pleas: how kaibot handles hooks](/notes/physics-not-pleas/index.md): Every “ALWAYS” and “NEVER” in your CLAUDE.md is a rule you’re hoping the model remembers. I turn those hopes into hooks my model can’t forget, and you can prompt your own Claude to do the same for you.
- [A memory that doesn’t rot](/notes/a-memory-that-doesnt-rot/index.md): Most memory setups for Claude are one file that grows forever, until nothing in it stands out and nobody trusts it. The doctrine kaibot runs instead: one fact per file, a capped index, and a scorer that decides what’s worth remembering today.
- [Your agent never holds the key](/notes/your-agent-never-holds-the-key/index.md): My agent runs shell commands all day: it greps logs, calls APIs, writes code. Everything it reads gets echoed into a transcript, and everything it types gets logged. That’s a bad place to keep a real credential. So I set kaibot up so the agent resolves what it needs at runtime and never once holds the value in a place it could print.
- [Tests with teeth: the testing rules I feed my coding agents](/notes/tests-with-teeth/index.md): Out of the box, AI writes the worst tests you can imagine. I feed my coding agents these rules before they write a line, distilled from ten conference talks and months of getting burned. Point your agent at this page.
- [Say the thing: making Claude stop sounding like Claude](/notes/say-the-thing/index.md): LLM prose has a recognizable sound: importance without specifics, drama without content, cleverness performed for an audience. I use a taxonomy to strip that sound out of writing (mine and my Claude’s) without stripping the writer, and you can give your Claude the same discipline.
- [Strip a stranger’s repo for parts (safely)](/notes/strip-a-repo-for-parts/index.md): Somebody ships a clever skills repo, a sharp blog post, a tool with one great idea inside it. I want the idea, not the dependency. I pull the 2-3 patterns worth taking, and run the safety gates first, because a cloned repo can attack your agent without ever executing a line of code.
- [Feed a lecture to your Claude](/notes/feed-a-lecture-to-your-claude/index.md): A great conference talk evaporates the moment you close the tab. The pipeline I run turns a YouTube lecture into two durable things: upgrades to a skill my Claude actually uses, and a searchable corpus entry, with the transcript filed under the exact slide that was on screen when each sentence was said.
- [The loop makes no decisions: how kaibot runs self-driving work](/notes/the-loop-makes-no-decisions/index.md): A friend told me he can’t get a self-driving loop going that produces work he’s happy with, so he’s still driving every step by hand. The loop he’s missing isn’t smarter than his. It’s dumber. Mine makes zero decisions while it runs, and that’s the whole trick.
- [The consultant fires itself: running Fable as an orchestrator](/notes/the-consultant-fires-itself/index.md): Fable is the most expensive model I can run, and the worst thing I can do with it is let it type. kaibot runs Fable as an orchestrator that plans, delegates to Opus and Sonnet, reviews, and exits, and that discipline is built into the harness so it survives every session, not just the ones where somebody remembers.
- [Have your agent look at your app the way a customer does](/notes/agent-visual-audit/index.md): A prompt you paste into Claude Code, or any agent with a shell and a browser, from the root of your app’s repo. It photographs every page on real data, writes down the design rules your app is already following, and hands you back one page you can actually read.
- [Homer: The Operator’s Card](/notes/homer-the-operators-card/index.md): You bring the job in one paragraph. It brings back branches with the receipts attached. Nothing touches main until you type the one command that does.
- [Fable ideas: what to do with the expensive one](/notes/fable-ideas/index.md): “What are some nice things people are doing with Fable anyway? I have access but I can’t think of anything Fable-worthy, Opus just works fine for me.” Friend, I am using the shit out of Fable, Opus, and Sonnet right now. The split, and a pile of ideas to steal.
- [Claude Max: the multi-account playbook](/notes/four-max-subscriptions/index.md): Three Max subscriptions. How to see them, swap them, add a client’s token, and pin a project so a client’s burn lands on the right account, automatically.
- [Claude on the go: Moshi + walk](/notes/claude-on-the-go/index.md): Keep a Claude Code session going from the iPhone while you walk the dog. The app is Moshi, the desk command is <code>walk</code>, and the office Mac does the actual work. I stopped using Moshi in October 2026; this is the setup as it ran.
- [Painting a world out of squares](/notes/painting-a-world-out-of-squares/index.md): I’m rebuilding the overworld map from the 1997 game Shandalar. The entire art problem fits in one sentence: take a grid of square tiles and make it read as a single hand-painted map. The pile of tricks that get you there, from a friend who spent a long time in the weeds so you don’t have to. I’ve since moved the overworld to pixel-art tilesets; this is what the painterly route taught me.
- [surprise plagiarism: what a verbatim sweep of 45,332 Project Gutenberg books actually finds](/notes/surprise-plagiarism/index.md): a sweep of 45,332 english books in the Standardized Project Gutenberg Corpus found 300,346 book pairs sharing three or more winnowing fingerprints, which after alignment means a run of shared text somewhere between fifty and several hundred thousand words. after every automatic flag, 134 candidate pairs were checked against the full Gutenberg transcriptions (164 checks, since 30 pairs with no clear order were checked both ways). six cases of uncredited reuse survived, and three of the six are the same Chicago reprint house doing the same thing. nothing found is a lost masterpiece. among the candidates the filters let through, the machine mostly learned how books were assembled: editions, omnibus volumes, anthologies, two books quoting one source, and publisher’s catalogues bound into the back.
