<?xml version="1.0" encoding="UTF-8"?><rss xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:content="http://purl.org/rss/1.0/modules/content/" xmlns:atom="http://www.w3.org/2005/Atom" version="2.0" xmlns:cc="http://cyber.law.harvard.edu/rss/creativeCommonsRssModule.html">
    <channel>
        <title><![CDATA[Stories by Hugo Sequier on Medium]]></title>
        <description><![CDATA[Stories by Hugo Sequier on Medium]]></description>
        <link>https://medium.com/@sequierh?source=rss-ba46bfc4582e------2</link>
        <image>
            <url>https://cdn-images-1.medium.com/fit/c/150/150/1*_PKaYcbgMAyOS2XXy1-8MA.png</url>
            <title>Stories by Hugo Sequier on Medium</title>
            <link>https://medium.com/@sequierh?source=rss-ba46bfc4582e------2</link>
        </image>
        <generator>Medium</generator>
        <lastBuildDate>Wed, 27 May 2026 08:28:28 GMT</lastBuildDate>
        <atom:link href="https://medium.com/@sequierh/feed" rel="self" type="application/rss+xml"/>
        <webMaster><![CDATA[yourfriends@medium.com]]></webMaster>
        <atom:link href="http://medium.superfeedr.com" rel="hub"/>
        <item>
            <title><![CDATA[Learning the Result Forgetting the Process]]></title>
            <link>https://medium.com/@sequierh/learning-the-result-forgetting-the-process-0c2ea5200452?source=rss-ba46bfc4582e------2</link>
            <guid isPermaLink="false">https://medium.com/p/0c2ea5200452</guid>
            <category><![CDATA[artificial-intelligence]]></category>
            <category><![CDATA[self-improvement]]></category>
            <category><![CDATA[education]]></category>
            <category><![CDATA[learning]]></category>
            <category><![CDATA[productivity]]></category>
            <dc:creator><![CDATA[Hugo Sequier]]></dc:creator>
            <pubDate>Wed, 13 May 2026 05:53:08 GMT</pubDate>
            <atom:updated>2026-05-13T05:53:08.623Z</atom:updated>
            <content:encoded><![CDATA[<h4>From school to AI, I was often taught to pass the test before I was taught to understand what I was doing.</h4><p>For a long time, I knew how to get decent grades without really understanding. Not always. Not in every subject. But often enough for it to become a method.</p><p>I was not looking for the why first. I was looking for the pattern. The type of exercise. The formula that matched. The recurring trap. The shortcut that worked on exam day.</p><p>And the worst part is that the system proved me right.</p><figure><img alt="" src="https://cdn-images-1.medium.com/max/1024/1*pTchUIXC2c-us6xWlAxTEA.png" /><figcaption>Image generated by GPT Image 2.0</figcaption></figure><h3>I learned how to beat the test</h3><p>At school, I cheated quite often.</p><p>Not in some spectacular way. Not the heist version with an earpiece, an accomplice, and a cheat sheet printed in font size 4. More the ordinary kind of cheating, the kind many people know but rarely admit. Looking at an answer. Preparing a trick. Memorizing just enough. Learning the combinations that showed up often.</p><p>Over time, I became good at one specific thing: recognizing the situation.</p><p>In math, I did not always understand the theorem deeply. But I knew where to use it. I would see a shape, a type of question, a clue in the prompt, and my brain would say: here, use this formula. There, take the derivative. There, factorize. There, do what we did in exercise 7 of the chapter.</p><p>That was not understanding. That was pattern recognition.</p><p>I see it much more clearly now. It may also explain why I loved the Souls games so much, Dark Souls, Elden Ring, Bloodborn. You die, you watch, you recognize the attack, you answer at the right time. The boss is no longer a mystery. It becomes a sequence. You do not need to understand the metaphysics of Lordran to dodge a charged attack.</p><p>At school, I was doing the same thing.</p><p>I was not always learning the subject. I was learning the boss.</p><h3>School said ”understand”, but graded “succeed”</h3><p>Students are told they need to understand. That is the official story. Serious teachers repeat it, and they are right.</p><p>But in many key moments, the reward lands somewhere else: performance at one specific point in time.</p><p>You can work slowly, ask good questions, improve, change the way you think. If you fail the exam, the visible trace is bad. On the other side, you can cram, copy a method, recognize two exercise types, and get a good grade. The visible trace is good.</p><p>The report card does not tell the process.</p><p>It tells the result.</p><p>MCQ tests make this even clearer. They can be useful, of course. But they often reward one very specific skill: picking the right box. Sometimes you know. Sometimes you eliminate. Sometimes you guess intelligently. And sometimes you simply recognize the structure of the question.</p><p>The moments where I felt the human was actually being evaluated were rarer. Oral exams, some live exercises, some reasoning problems where you had to explain your path. There, you could not just drop the result like a package at the door. You had to show how you were thinking. Your hesitation mattered. The way you corrected a mistake mattered. Your ability to stand in front of someone pushing you a little mattered.</p><p>It was uncomfortable.</p><p>So probably closer to learning.</p><h3>The process is invisible, so we abandon it</h3><p>The problem is that process does not show well.</p><p>A grade shows. A degree shows. A job title shows. Income shows. An app launched in 48 hours shows. A clean dashboard screenshot shows.</p><p>The process is often ugly.</p><p>It looks like drafts, mistakes, crossed-out sentences, moments where you realize you do not know, steps backward, days with nothing worth posting.</p><p>Nobody wants to post: “Today I realized my solution was wrong, so I deleted three days of work.” Yet sometimes that is the best day of the week.</p><p>This obsession with results also creates a toxic bias: we mostly listen to <strong>survivors</strong>.</p><p>Someone succeeds, then explains that it was possible, that you just had to believe, work hard, wake up early, stay disciplined, do what they did. Their main argument becomes their success. Look, it worked for me.</p><p>But we do not see the people who applied the same method and failed. We do not see the people who did not start with the same conditions. We do not see the failed attempts, the luck, the invisible support, the timing, the network, the mental health, the family money, the language, the city, the randomness.</p><p>We turn a survivor’s result into a universal lesson.</p><p>And because we mostly judge the end, we start looking down on anything that does not produce quickly.</p><p>Thinking becomes suspicious. Doubt becomes weakness. Going back to basics feels like wasted time. Deep understanding seems less profitable than knowing what to apply at the right moment.</p><p>I know that reflex because I used it for years.</p><h3>The quiet disappearance of “why?”</h3><p>There is another loss inside this, quieter but maybe more damaging.</p><p>We stop asking why.</p><p>Not because the question became useless. The why is still where real understanding begins. Why does this theorem work? Why is the formula shaped like that? Why does this architecture fail here and not there? Why did this strategy work once and collapse the second time?</p><p>The why is curiosity, but it is also compression. When you understand why something works, you do not need to memorize every possible variation. You can rebuild the answer from first principles. You can adapt when the exercise changes slightly. You can notice when a shortcut no longer applies.</p><p>But the why is expensive.</p><p>It takes time. It makes you slower at first. It does not always improve the next grade, the next demo, the next screenshot, the next visible result. You can spend an hour understanding a concept deeply and receive no external signal for it. No applause. No peer validation. No metric moving up. Nobody sees the small internal click.</p><p><strong>So you start asking why only for yourself.</strong></p><p>And that is hard to maintain in a world that rewards everything around it. The finished feature gets praise. The high mark gets praise. The launch post gets likes. The person who asks why might just look slow.</p><p>At first, you still ask. Then you ask less. Then you ask only when you have time. Then time never comes. Step by step, the space that used to belong to curiosity gets occupied by output.</p><p>That is how you lose the why without noticing.</p><p>Not through one dramatic decision. Through a thousand small moments where understanding has no immediate reward, while results do.</p><h3>AI makes the shortcut almost perfect</h3><p>In my last article, I wrote about the <a href="https://medium.com/@sequierh/the-productivity-trap-of-ai-ea165b7ece6b">productivity trap of AI tools</a>. The more I think about it, the more I believe AI did not create our obsession with results. It made it much more efficient.</p><p>Before, there was still friction.</p><p>If you wanted to code a feature, you had to fight with the language, the API, the bugs, the files, the documentation. Even if you wanted to go fast, reality forced you to meet part of the process.</p><p>Now you can delegate a lot.</p><p>You give an intention to Claude Code, Codex, or any other AI Coding Agents. The agent writes the files, proposes an architecture, runs tests, fixes errors, formats everything. You get back a clean result, often impressive. And if you are not careful, your brain claims the result without having lived the path.</p><p>That is where something breaks.</p><p>Because our sense of legitimacy is not built only on what exists at the end. It is built on effort, decisions, errors crossed, small cognitive pains that prove to your brain: I was there, I participated, I understood enough to move forward.</p><p>When AI takes the whole process and you keep only the deliverable, attribution becomes blurry.</p><p>Did I build this feature? Did I only ask someone to build it? Do I really understand this code? Could I rebuild it without help?</p><p><a href="https://medium.com/@sequierh/the-impostor-loop-why-vibecoding-made-me-feel-like-a-fraud-a24a2a162971">Impostor syndrome</a> loves that kind of grey zone.</p><figure><img alt="" src="https://cdn-images-1.medium.com/max/1024/1*fR9-osf6ZQjFcS2C4nd7EQ.png" /><figcaption>Image generated by GPT Image 2.0</figcaption></figure><h3>I do not want to confuse shortcut with intelligence anymore</h3><p>I do not regret learning how to recognize patterns. It is useful. It is even a big part of practical intelligence.</p><p>A good engineer recognizes architectures. A trader recognizes setups. A musician recognizes progressions. A Souls player recognizes the animation that announces the slap.</p><p>The problem starts when recognition replaces understanding entirely.</p><p>For a long time, I saw the why as a waste of time. Why learn a formula deeply if the exam lasts two hours and the next chapter starts on Monday? Why understand the whole architecture if the agent can generate a solution that passes the tests? Why slow down if the world rewards people who show output quickly?</p><p>That logic works. Until it does not.</p><p>It works to pass an exam. It works to produce a demo. It works to feel like you are moving forward. Then one day, you need to explain, change, fix, transmit, teach, decide without an obvious model. And there, patterns are not enough.</p><p><strong>You realize you optimized for exam day.</strong></p><p><strong>Not for the person you wanted to become.</strong></p><h3>Protecting the process</h3><p>I do not have a clean moral lesson to sell here. I still use AI every day. I still like shortcuts. I am still tempted by the fast result, the good grade, the clean screenshot, the pleasant feeling of having moved forward.</p><p>But I am trying to draw a boundary again.</p><p>Sometimes, I should let AI do it. Sometimes, I should do it myself. Not out of artisanal pride. To keep the muscle.</p><p>Write before asking for a rewrite. Draw the architecture before generating the code. Explain a concept without looking at the answer. Read a file from top to bottom. Redo a calculation by hand. Accept spending one hour on a problem AI could probably solve in twenty seconds.</p><p>Not all the time. That would be ridiculous.</p><p>But often enough for my brain to stay involved in its own life.</p><p>Because when we only value the result, we eventually become strangers to what we produce. We collect visible proof of competence, but we lose the private feeling of having understood something.</p><p>I think that is the real danger.</p><p>Not that AI makes us stupid overnight. More that it lets us continue an old habit with much more powerful tools: succeeding without always learning, producing without always understanding, collecting credit for a process we barely went through.</p><p>So the question I want to keep in mind is simple.</p><p><strong>When I get a good result, which part of the path truly belongs to me?</strong></p><img src="https://medium.com/_/stat?event=post.clientViewed&referrerSource=full_rss&postId=0c2ea5200452" width="1" height="1" alt="">]]></content:encoded>
        </item>
        <item>
            <title><![CDATA[The Productivity Trap of AI]]></title>
            <link>https://medium.com/@sequierh/the-productivity-trap-of-ai-ea165b7ece6b?source=rss-ba46bfc4582e------2</link>
            <guid isPermaLink="false">https://medium.com/p/ea165b7ece6b</guid>
            <category><![CDATA[software-development]]></category>
            <category><![CDATA[ai]]></category>
            <category><![CDATA[ai-agent]]></category>
            <category><![CDATA[productivity]]></category>
            <category><![CDATA[society]]></category>
            <dc:creator><![CDATA[Hugo Sequier]]></dc:creator>
            <pubDate>Sun, 10 May 2026 06:46:35 GMT</pubDate>
            <atom:updated>2026-05-10T06:49:51.033Z</atom:updated>
            <content:encoded><![CDATA[<h4><em>We learned to produce faster, but I am not sure we learned what that production is doing to us.</em></h4><p>Around AI, productivity became the whole personality. Not thinking. Producing.</p><p>I use these tools every day. Claude Code, Codex, Cursor, agent workflows, multi-terminal setups, API credits burned like jet fuel. I have been deep inside that wave.</p><p>So this is not an anti-AI rant. I use these tools. I like them. They can free people in real ways.</p><p>It is a self-reflection from someone who likes the tools and still feels that something is wrong, not only in software, but in the way we look at work, value, intelligence, and each other.</p><figure><img alt="" src="https://cdn-images-1.medium.com/max/1024/1*KUHuZhJhJYk1HyEzD2ZclA.png" /><figcaption>Image generated by GPT Image 2.0</figcaption></figure><h3>The New Standard Is Output</h3><p>For a while, AI coding tools felt like magic because they removed friction.</p><p>You had an idea. You described it. Depending on your preference, you opened Claude Code, Codex, Cursor, or another agentic coding tool. The model produced a first version, edited files, ran commands, and pushed the project forward. Suddenly, a solo developer could move like a small team.</p><p>That part is real. I do not want to pretend otherwise. I have seen these tools save hours across agent systems, trading bots, internal tools, and content workflows. When the setup is clean, the gain is obvious.</p><p>But the social layer around these tools changed fast, and this is the part that feels bigger than coding. The conversation stopped being: “Can we build better things?” It became: “How much did you produce today?”</p><p>Screenshots of apps built in one weekend. Videos of agents writing thousands of lines. Threads about running several agents or terminals in parallel. People talking about spending $1,000 in API calls like it is the price of being serious. If you are not using one of the newest agentic coding tools, you feel late.</p><p>The new standard is not quality. It is motion.</p><p>And once the standard becomes motion, stillness starts to feel like failure.</p><p>That is the part that bothers me.</p><h3>What the Metrics Hide</h3><p>Lines of code are easy to count (hello Garry). Features are easy to demo. Deployment frequency looks good in public. Architecture does not look good in a tweet. Neither does code review, deleting code, or spending two hours deciding that the feature should not exist.</p><p>AI coding tools make this worse because they are extremely good at producing visible output. Ask for a dashboard, you get a dashboard. Ask for auth, you get auth. Ask for a SaaS boilerplate, you get a SaaS boilerplate. The first impression is strong enough to feel like progress.</p><p>But “it works” is a very low bar.</p><p>Does it scale? Can another developer understand it? Can you change it safely next month? Do you know why the agent made that architecture choice? Did anyone review the failure modes?</p><p>Most of the time, we skip those questions because the demo already feels like success.</p><p>I have caught myself doing this. Letting the agent push forward because forward feels productive. Accepting files I did not fully read because the tests passed. Asking for one more feature instead of asking whether the system was still coherent.</p><p>That is a dangerous habit. Not because the machine is evil. Because the machine rewards impatience.</p><figure><img alt="" src="https://cdn-images-1.medium.com/max/1024/1*YdDI359lqHDeN1dvITsftA.png" /><figcaption>Image generated by GPT Image 2.0</figcaption></figure><h3>This Is Bigger Than Coding</h3><p>The uncomfortable part is that coding is just one version of a wider problem.</p><p>Capitalism is very good at turning human activity into measurable output. More calls. More posts. More tickets closed. More meetings. More workouts. More content. More apps. More everything.</p><p>And when the number becomes the target, the activity changes shape.</p><p>People do not write to clarify ideas. They write to publish. They do not exercise to feel healthy. They exercise to track streaks. They do not learn to understand. They learn to display progress. They do not build software to solve a problem. They build because shipping is proof that they are not falling behind.</p><p>That pressure is not new. AI just compresses the cycle, then makes the cycle look normal. Before, if you wanted to build an app without thinking, reality stopped you. You had to design the database. You had to wire the frontend. You had to fight with the API. The friction forced some reflection.</p><p>Now the friction is optional.</p><p>You can wake up with a vague idea, open your preferred coding agent, run several tasks in parallel, generate the repo, the UI, the backend, the landing page, the post announcing it, and feel like you built something.</p><p>Maybe you did. But maybe you only supervised output.</p><p>That distinction matters because our brains adapt to what we ask from them. If the first move is always delegation, we train ourselves to skip the slow part: framing the problem, sitting with ambiguity, choosing constraints, saying no.</p><p>We start losing the muscle of thinking before doing. And then we call it productivity. But this is not only about ambitious developers shipping too many side projects. That is almost the privileged version of the problem.</p><p>For many people, work is not a playground where they can optimize workflows and automate boring tasks. Work is rent. Food. Debt. A salary that arrives at the end of the month and sometimes still does not cover the bills.</p><p>When life gets that tight, people do not have much space left to think about “the future of work.” They think about surviving this month.</p><p>And then AI arrives with two promises at the same time. The first promise is beautiful: you can produce more with less. You can save time. You can learn faster. You can create things without asking permission. The second promise is darker: if you do not adapt, you may be replaced. Both promises are true enough to be dangerous.</p><h3>The Inequality Nobody Wants to Say Out Loud</h3><p>I hear people say that AI is available to everyone. Technically, yes. Many people can open ChatGPT or Claude. A phone is enough to start.</p><p>But access is not the same thing as power.</p><p>To make money with AI, you usually need more than a prompt box. You need taste. Domain knowledge. Time after work. Confidence. A network. Some understanding of business, code, design, distribution, or operations.</p><p>Those things are not distributed equally.</p><p>If you grew up around educated people, if you learned how to learn, if you already work with information, AI can feel like a multiplier. You have processes to automate. You have problems to package. You know where the money is.</p><p>Obviously, everyone can read a $10 book (or borrow at the library) or watch free content on YouTube to learn about AI, business, networking, etc. But there is a true dissociation between access and orientation. The resources may be public, but knowing what to search for, why it matters, how to evaluate it, and how to turn it into leverage is itself a form of privilege.</p><p>The internet made information cheap, but it did not make opportunity equally usable.</p><p>If you are a cashier in a grocery shop, the story is different. You can know exactly what is coming. Self-checkout, cameras, robots, inventory systems, automated support, fewer humans on the floor. You can see the direction. But what are you supposed to do with that information after an exhausting shift?</p><p>Open Claude and build a SaaS? Start a personal brand? Buy a course from someone selling “AI side hustles” with screenshots of fake revenue?</p><p>That advice is insulting when it ignores the conditions people live in. I do not believe that a scammy e-book or a two-hour online formation gives someone the knowledge needed to turn AI into economic freedom. Useful knowledge is slower than that. It comes from exposure to systems, markets, clients, failure, and people who know the game.</p><p>So AI may emancipate some people while making others more replaceable.</p><p>That is the part I cannot shake.</p><h3>The Question I Cannot Ignore</h3><p>I understand why everyone is excited. A single developer can now do things that were absurd two years ago. That is not a small shift. It opens real possibilities for builders, indie hackers, researchers, small teams, and people who were blocked by lack of resources.</p><p>But I do not want to confuse access with wisdom.</p><p>The ability to produce software does not automatically create the ability to design software. The ability to generate content does not create a point of view. The ability to access AI does not create equal opportunity.</p><p>And if we are not careful, we will build a culture where the highest-status person is the one producing the most artifacts, not the one thinking the most clearly.</p><p>That culture will produce apps. Many of them. It will also produce burnout, shallow thinking, fragile systems, and people who feel behind even while moving faster than ever.</p><p>So the questions I keep coming back to are simple, but I do not think they have simple answers.</p><blockquote>Is it really productive to ship ten apps in a week if you do not understand what you built?</blockquote><blockquote>Is AI really emancipating people if the people best positioned to benefit are already the people with the most education, time, language skills, and network?</blockquote><blockquote>What happens to the people whose jobs are easy to automate but whose lives leave them almost no room to reskill?</blockquote><blockquote>What happens to our brains when the first reflex is no longer to think, but to delegate?</blockquote><p>I do not have a clean answer. Maybe that is why this topic keeps bothering me.</p><p>For now, I only know that I do not want to celebrate productivity without asking who pays for it, who benefits from it, and what parts of ourselves we trade away to keep up.</p><img src="https://medium.com/_/stat?event=post.clientViewed&referrerSource=full_rss&postId=ea165b7ece6b" width="1" height="1" alt="">]]></content:encoded>
        </item>
        <item>
            <title><![CDATA[Why AI Agent Harnesses Matter More Than Model Choice]]></title>
            <link>https://medium.com/@sequierh/why-ai-agent-harnesses-matter-more-than-model-choice-b83165a222d4?source=rss-ba46bfc4582e------2</link>
            <guid isPermaLink="false">https://medium.com/p/b83165a222d4</guid>
            <category><![CDATA[ai]]></category>
            <category><![CDATA[claude-code]]></category>
            <category><![CDATA[software-development]]></category>
            <category><![CDATA[ai-agent]]></category>
            <category><![CDATA[artificial-intelligence]]></category>
            <dc:creator><![CDATA[Hugo Sequier]]></dc:creator>
            <pubDate>Wed, 15 Apr 2026 14:44:33 GMT</pubDate>
            <atom:updated>2026-04-15T14:48:29.306Z</atom:updated>
            <content:encoded><![CDATA[<h4>Gemma and Qwen keep getting better, but most agent failures still come from bad execution architecture.</h4><p>Everyone is debating models. Almost nobody is debating harness design. That is why teams keep switching models while their coding agents stay unstable.</p><p>There is also a quiet fear in the market now: every new model release makes people feel more dependent on the next one. Six months ago, many teams were shipping serious work with the models they had and were happy with the results. Today, after a few new launches, those same models are often treated like they are obsolete or unusable.</p><p>Most of the time, that perception shift is exaggerated. With a disciplined harness, many “older” or smaller models still perform very well on real coding workflows.</p><p>I learned this after burning through a paid coding plan in record time. I tested many model and tooling setups across Codex, Claude Code, OpenCode, Cursor, Z.AI, and MiniMax CLI. At first I blamed context limits. Then I blamed pricing. The root cause was my own architecture.</p><h3>The Missing Variable in Most Agent Discussions</h3><p>When an agent fails, the first reaction is model shopping.</p><p>Should we move from model A to model B?</p><p>That question matters, but it comes second. First comes harness quality.</p><p>For coding agents, the harness is the execution layer around the model: routing rules, tool contracts, state handling, memory strategy, sandbox policy, retry behavior, and verification.</p><p>If this layer is weak, a better model only gives you cleaner failure logs.</p><figure><img alt="" src="https://cdn-images-1.medium.com/max/1024/1*jM9b46I2ZUUopfbrS-k3fg.png" /><figcaption>Diagram generated with Gemini</figcaption></figure><h3>What Changed in My Own Workflow</h3><p>My previous setup was classic and messy.</p><p>One large root instruction file, one agent handling everything, one context carrying code exploration, shell output, planning notes, and implementation all together.</p><p>The root file was around 200 lines. It was read again and again, even for narrow tasks. Shell output stayed in memory long after it was useful. Dead-end branches stayed too.</p><p>So I rebuilt the architecture.</p><p>I cut the root router to 27 lines. I moved detailed context to scoped docs. I split responsibilities into seven specialized subagents with isolated context. Deterministic steps, lint, build, tests, moved to shell paths instead of reasoning paths.</p><p>Result: roughly 40 to 50 percent less token load per session, and better output quality because the model stopped swimming in irrelevant context.</p><p>You can read more detail in my previous Article : <a href="https://medium.com/@sequierh/how-i-cut-token-usage-in-half-by-redesigning-my-agent-architecture-05a3cff82b5b">https://medium.com/@sequierh/how-i-cut-token-usage-in-half-by-redesigning-my-agent-architecture-05a3cff82b5b</a></p><h3>Terminal-Bench 2.0 Makes the Point Obvious</h3><p>Terminal-Bench 2.0 is a strong reminder that agent performance is system performance.</p><p>The benchmark includes 89 tasks in real terminal environments. That means runtime setup can influence outcomes directly.</p><p>Anthropic published analysis showing that infrastructure choices alone shifted Terminal-Bench 2.0 results by up to 6 percentage points in their experiments. Same model, different resource enforcement and headroom, different scores.</p><p>This should reset how we read leaderboards.</p><p>A few points of difference can come from harness and infra behavior, not just model ability. If two teams report different outcomes on the same model, the first place to inspect is execution setup.</p><figure><img alt="" src="https://cdn-images-1.medium.com/max/1024/1*veA0pej2FjQ5VhDCp2mASw.png" /><figcaption>Benchmark from <a href="https://www.tbench.ai/leaderboard/terminal-bench/2.0?models=Claude+Opus+4.6">Terminal-Bench 2.0</a> filtered on Claude Opus 4.6</figcaption></figure><h3>Why Local Models Make Harness Design Even More Important</h3><p>Local AI is moving fast. Gemma 4 and Qwen 3.x are improving quickly for tool-use scenarios. I track them closely, and the progress is real.</p><p>But smaller local models are less tolerant of fuzzy tool definitions and loose control flow. They need stricter harness rules to stay reliable.</p><p>What helps most:</p><ul><li>explicit tool schemas</li><li>clear preconditions before tool calls</li><li>constrained argument formats</li><li>compact state snapshots</li><li>short verify loops</li></ul><p>Without this structure, drift appears early. With this structure, local models can power useful coding and automation tasks at much lower cost.</p><h3>A Minimal Harness Blueprint</h3><p>You do not need a giant framework to start. A simple loop is enough:</p><pre>loop:<br>  - observe: read scoped docs and active state<br>  - plan: choose one small target<br>  - act: use the right tool path<br>  - verify: run checks before claiming success<br>  - write_back: store only durable decisions<br>routing:<br>  - explore: read-only agent<br>  - docs: documentation router<br>  - shell: deterministic runner<br>  - code: main reasoning agent<br>  - review: isolated critic</pre><p>This works with frontier models, local models, or a mixed stack. Model quality still matters. Harness quality decides whether the model spends effort on forward progress or cleanup.</p><p>When an agent underperforms now, I audit harness friction before changing models: context bloat, wrong routing, weak verification, and noisy memory write-back.</p><p>That audit usually finds the bottleneck quickly.</p><p>Model progress will keep accelerating. The teams that get consistent output will be the ones that treat harness design as core engineering work. If you evaluate agent stacks this quarter, score both model quality and harness quality side by side. Most teams still score only one.</p><blockquote>I’m Hugo, a freelance Data Scientist specializing in AI for Construction. I build intelligent systems for a living, and apparently also for my note-taking. Find me on <a href="https://www.linkedin.com/in/hugo-sequier/">LinkedIn</a> or on my <a href="https://linktr.ee/sequierh">Linktree</a>.</blockquote><img src="https://medium.com/_/stat?event=post.clientViewed&referrerSource=full_rss&postId=b83165a222d4" width="1" height="1" alt="">]]></content:encoded>
        </item>
        <item>
            <title><![CDATA[How I Cut Token Usage in Half by Redesigning My Agent Architecture]]></title>
            <link>https://medium.com/@sequierh/how-i-cut-token-usage-in-half-by-redesigning-my-agent-architecture-05a3cff82b5b?source=rss-ba46bfc4582e------2</link>
            <guid isPermaLink="false">https://medium.com/p/05a3cff82b5b</guid>
            <category><![CDATA[productivity]]></category>
            <category><![CDATA[automation]]></category>
            <category><![CDATA[ai-agent]]></category>
            <category><![CDATA[artificial-intelligence]]></category>
            <category><![CDATA[claude-code]]></category>
            <dc:creator><![CDATA[Hugo Sequier]]></dc:creator>
            <pubDate>Tue, 07 Apr 2026 13:01:01 GMT</pubDate>
            <atom:updated>2026-04-07T13:01:01.926Z</atom:updated>
            <content:encoded><![CDATA[<h4>Bigger models, same bill. The fix is in how you architect.</h4><p>For the past two months, my Twitter feed has been full of the same complaint: “I hit my Claude Code plan limit in 3 days.” “Codex burned through my credits by Thursday.” “These coding agents are a money pit.” Same frustration, different avatar. And every time, someone replies with the same advice: use a cheaper model, compress your prompts, buy the higher tier.</p><p>That advice is wrong.</p><p>I recently switched to OpenCode, partly to test Codex integration, partly to experiment with local LLMs. One week in, I blew through my entire Codex subscription. That got my attention. I work across multiple projects every day, a computer vision pipeline for floorplan analysis, a Polymarket trading bot, a SaaS product, and I lean heavily on subagents to keep all of it moving. Turns out the way I was using them was the reason my bill was so high.</p><h3>The Plan Limit Panic Is a Symptom</h3><p>Let’s get something out of the way. Hitting your plan limit means your architecture is wasteful. The plan size is fine.</p><p>Most people set up their coding agent like this: one giant CLAUDE.md at the root that explains everything. Full project structure, every convention, every decision, every gotcha, all in one file. Then they start a session, ask the agent to do something, and the agent reads all of it. Every time. Even when the task only touches one file.</p><p>That’s like handing someone a 200-page manual when they asked where the bathroom is.</p><p>The agent doesn’t need to understand your entire project to fix a bug in the auth module. It needs to understand auth. The rest is noise. And noise costs tokens. Tokens cost money. Money makes people angry on Twitter.</p><p>The fix isn’t a bigger plan or a cheaper model. The fix is structuring your context so the agent reads what matters and skips what doesn’t.</p><figure><img alt="" src="https://cdn-images-1.medium.com/max/1024/1*_otfDqhqb9n3I0N3Nd9YXA.png" /></figure><h3>Rule One: Don’t Explain, Route</h3><p>My root AGENTS.md is 27 lines. That&#39;s it. No project architecture, no tech stack dumps. Just core behavior rules and a dispatch policy that points the agent to project-specific files where the real context lives.</p><pre>## Dispatch policy<br><br>- `repo-explorer`: repo exploration, file localization, no edits.<br>- `doc-router`: documentation-first routing, identify canonical docs.<br>- `plan-critic`: stress-test plans, find risks, propose simplifications.<br>- `bash-runner`: utility shell checks, lint/build, no edits.<br>- `vault-bridge`: vault-oriented commands and workflows.<br>- `changelog-keeper`: version bookkeeping.<br>- `scratch-compactor`: compact session state into resume-ready notes.</pre><p>The root file is a router, not an encyclopedia. When the agent needs depth, it reads the project-specific documentation on demand. When it doesn’t need depth, it never sees it. That alone cut my per-session token usage by maybe 30% because the agent stopped reading information it would never use.</p><h3>Documentation as a Routing System</h3><p>I used to think feature docs were about explaining your code to the agent. Turns out they’re routing tables.</p><p>My documentation system has three layers:</p><p>Feature-level docs. One markdown file per feature, already condensed, maybe 30 lines each. Key files, patterns, conventions, and gotchas for a specific area.</p><p>Routing indexes. Lightweight files that tell the agent where to look: docs/_index.md as the entry point, feature-map.md for feature-to-doc mapping, architecture/_index.md for technical routing, decision-index.md for constraints and past decisions.</p><p>Decision records. Short entries that capture why something was built a certain way, so the agent doesn’t re-litigate old choices.</p><p>The goal is simple: avoid scanning the entire codebase. Read only what’s necessary for the task at hand. An agent working on the payment module should never see the notification system’s architecture notes.</p><p>This sounds obvious when you say it. But most setups don’t do it. They dump everything into one place and hope the agent sorts it out. The agent sorts it out, all right, by reading all of it and billing you for every token.</p><figure><img alt="" src="https://cdn-images-1.medium.com/max/1024/1*a-8kImM0Pul1VAilx0mIDQ.png" /></figure><h3>Seven Agents, Seven Jobs</h3><p>The next move was splitting the agent’s responsibilities. One agent doing everything (exploring code, reading docs, writing plans, running shell commands, updating changelogs) gets bloated fast. I created specialized subagents instead, each with a narrow job.</p><p>The subagents:</p><p>repo-explorer finds files, searches code, locates functions. Read-only, cheap model, fast.</p><p>doc-router decides what documentation to read based on the task. Avoids pulling in code when docs are enough.</p><p>plan-critic stress-tests implementation plans. Finds risks, weak assumptions, and over-engineering. Runs in isolation so it doesn&#39;t carry the full session context.</p><p>bash-runner runs CLI tasks: lint, build, test, sanity checks. Deterministic work that doesn&#39;t need an LLM at all.</p><p>vault-bridge manages project memory: kanban updates, changelog entries, knowledge writes.</p><p>changelog-keeper handles version bookkeeping with structured output.</p><p>scratch-compactor summarizes session state into compact notes at the end of a session. Only writes durable memory when explicitly needed.</p><p>Each subagent runs with its own context. The main agent never sees the bash output unless it matters. The plan critic doesn’t carry the exploration history. The doc router doesn’t carry the shell results. Context stays local to where it’s needed.</p><p>This is the part that feels like overkill until you measure it. A bash runner executing 5 shell commands generates maybe 200 lines of output. If that output stays in the main agent’s context for the rest of a 50-message session, every subsequent message re-processes it. Multiply that across commands, explorations, and dead-end branches, and your context is 60% noise by the end.</p><h3>The Dispatch Rules</h3><p>Having subagents is only useful if you route tasks correctly. Here’s my dispatch logic:</p><ul><li>Exploration tasks → cheap subagent (repo-explorer)</li><li>Documentation lookups → cheap subagent (doc-router)</li><li>CLI and shell work → cheap subagent (bash-runner)</li><li>Complex reasoning and code writing → main agent</li><li>Plan validation → isolated subagent (plan-critic, no session context)</li><li>Memory and state updates → dedicated subagent (vault-bridge)</li></ul><p>The principle: if a task is deterministic or narrow, it doesn’t belong in the main agent’s context. The main agent should focus on decisions that require reasoning, architecture choices, code design, trade-off analysis.</p><p>Everything else gets delegated.</p><h3>The Workflow Pipeline</h3><p>My old workflow was: think, explore, code, test, done. All in one agent. All in one context. All accumulating tokens.</p><p>The new workflow is a 9-step pipeline:</p><ol><li>Session start (light, read routing indexes only)</li><li>repo-explorer (locate relevant files)</li><li>doc-router (identify what docs to read)</li><li>Plan draft (main agent, scoped context)</li><li>plan-critic (isolated review, separate context)</li><li>Implementation (main agent, clean context)</li><li>bash-runner (tests, lint, build — if needed)</li><li>scratch-compactor (summarize session)</li><li>Write-back (only if a decision was made or pattern discovered)</li></ol><p>The user experience stays simple. I type /plan review or a task description, and the pipeline runs. But under the hood, each step gets a fresh, scoped context. The agent doesn&#39;t carry dead exploration branches into implementation. It doesn&#39;t re-process shell output during plan review.</p><p>Step 9 is the one most people get wrong. They write back after every action. Don’t. Only write to memory when:</p><ul><li>A decision was made that affects future work</li><li>A new pattern or convention was discovered</li><li>A meaningful change happened (architecture shift, new dependency, resolved gotcha)</li></ul><p>If nothing changed that future sessions need to know, don’t write anything. Less noise in the memory layer means less noise in the next session’s startup. It compounds.</p><h3>Use the Right Tool for the Job</h3><p>A coding agent is a reasoning engine. Using it to run npm run lint is like hiring a consultant to check your email.</p><p>I route deterministic tasks to CLI tools and scripts. Linting, building, running tests, checking file existence, querying logs. All of that runs through bash-runner or direct shell commands. The LLM only sees the result if the result needs interpretation (test failure, build error with a non-obvious cause).</p><p>This alone saves a surprising amount. A single lint run might output 50 lines. If that goes through the LLM, every subsequent message in the session processes those 50 lines. If it goes through bash-runner, the main agent sees a one-line summary: “3 warnings, 0 errors.”</p><p>Same information. Different cost.</p><h3>The Active Context File</h3><p>One more thing that helped: a lightweight _active.md file maintained across the session. It contains:</p><ul><li>Current goal</li><li>Files touched so far</li><li>Decisions made this session</li><li>Next step</li></ul><p>Instead of reloading full project context at every turn, the agent reads this compact file. It’s maybe 10 lines instead of 200. When the agent needs depth on a specific file, it reads the feature doc for that area. When it just needs to remember what it’s doing, _active.md is enough.</p><h3>What Actually Changed</h3><p>After implementing this architecture across my projects:</p><p>The token count per session dropped roughly 40–50%. Not because I’m using fewer messages, but because each message processes less irrelevant context. The agent reads the routing index, loads only the relevant feature doc, delegates narrow tasks to subagents, and keeps the main context focused on decisions.</p><p>Output quality went up. Counterintuitive at first, but it makes sense. When the agent isn’t drowning in noise, it makes better decisions. It doesn’t get confused by conventions from a different module. It doesn’t second-guess itself because it saw conflicting patterns in unrelated code. Scoped context produces scoped thinking, and scoped thinking is more accurate.</p><p>The Codex subscription stopped being a problem. I stopped burning through it by mid-week. Same projects, same output quality, just a cleaner architecture doing the heavy lifting.</p><h3>Bigger Boxes, Same Junk</h3><p>Every few months, a new model drops with a bigger context window, and everyone celebrates. 200K tokens, 500K, 1M. And every time, I think the same thing: if your context is 60% noise at 200K, it’ll be 60% noise at 1M. A bigger box full of junk is still a box full of junk.</p><p>The real optimization doesn’t come from the model. It comes from how you structure the information the model sees. Route your context, don’t dump it. Specialize your agents, don’t generalize them.</p><p>The agents are getting smarter. That’s great. But a smart agent reading the wrong context will still produce the wrong answer. It’ll just do it faster and at a higher price point.</p><p>Your plan limit isn’t the bottleneck. Look at your architecture.</p><blockquote>I’m Hugo, a freelance Data Scientist specializing in AI for Construction. I build intelligent systems for a living, and apparently also for my note-taking. Find me on <a href="https://www.linkedin.com/in/hugo-sequier/">LinkedIn</a> or on my <a href="https://linktr.ee/sequierh">Linktree</a>.</blockquote><img src="https://medium.com/_/stat?event=post.clientViewed&referrerSource=full_rss&postId=05a3cff82b5b" width="1" height="1" alt="">]]></content:encoded>
        </item>
        <item>
            <title><![CDATA[How I Built a Second Brain for Claude Code]]></title>
            <link>https://medium.com/@sequierh/how-i-built-a-second-brain-for-claude-code-b49b3104b386?source=rss-ba46bfc4582e------2</link>
            <guid isPermaLink="false">https://medium.com/p/b49b3104b386</guid>
            <category><![CDATA[obsidian]]></category>
            <category><![CDATA[artificial-intelligence]]></category>
            <category><![CDATA[productivity]]></category>
            <category><![CDATA[claude-code]]></category>
            <category><![CDATA[ai-agent]]></category>
            <dc:creator><![CDATA[Hugo Sequier]]></dc:creator>
            <pubDate>Thu, 02 Apr 2026 13:01:02 GMT</pubDate>
            <atom:updated>2026-04-02T13:26:54.515Z</atom:updated>
            <content:encoded><![CDATA[<h4>After using Obsidian as my own external brain, I realized the real bottleneck was the agent doing the work</h4><figure><img alt="" src="https://cdn-images-1.medium.com/max/1024/1*8WJ3lG5Qyxe2mbgtMKpMyg.png" /></figure><p>Last time I explained how I use Obsidian and Claude Code as a second brain. A few weeks later I realized I was solving the wrong memory problem. If Claude Code is the one doing a big part of my job right now, why did I build a second brain for myself and not for the agent?</p><p>That question changed the architecture of my vault. I stopped treating Obsidian as a personal note system with AI access, and started treating it as an external memory layer for the coding agent itself. That shift fixed the part that every heavy user of Claude Code, Codex, or OpenCode runs into sooner or later: the chat gets fat, the context gets noisy, and the agent keeps relearning things it should already know.</p><h3>The Memory Problem Shows Up Fast</h3><p>If you use coding agents lightly, this barely matters. Open a repo, ask for a small fix, close the session, move on.</p><p>But that is not how I work anymore.</p><p>Claude Code touches my production projects every day. It writes code, updates docs, creates notes, logs project progress, and helps me move between very different contexts: a construction-tech pipeline, a trading bot, content systems, and internal automation. After enough sessions, one thing becomes obvious. The problem is not model intelligence. The problem is memory hygiene.</p><p>Inside a long session, the agent carries all the usual baggage: old prompts, explored files, dead ends, partial plans, tool output, half-useful explanations. Some of that context is valuable. A lot of it is just residue. And when you start the next session, that residue is gone anyway unless you manually restate everything.</p><p>So you get hit twice.</p><p>First, long sessions become slower and more expensive because too much irrelevant context sticks around.</p><p>Second, finished sessions throw away useful things that should have survived: architectural decisions, naming conventions, lessons from failed attempts, and links between projects that share the same domain knowledge.</p><p>That is a bad setup for an agent that is supposed to work like a real collaborator.</p><h3>My First Setup Solved Only Half the Problem</h3><p>I had already fixed part of this.</p><p>In a previous article I explained how I keep Claude Code fast with a root CLAUDE.md, a .claude/ folder, and feature docs written in markdown. That setup still works. I use it every day. It is simple, cheap, and much better than piling on plugins or MCP layers just because the agent keeps missing context.</p><p>Inside one repo, that pattern is enough most of the time.</p><p>The issue appeared when the work stopped being repo-local.</p><p>I wanted the agent to remember that a decision made in one project might matter in another. I wanted reusable notes about tools, APIs, and architecture tradeoffs to survive outside a single codebase. I wanted failed experiments to become assets instead of disappearing into old conversations. And I wanted the agent to start a session by reading the right memory, not by asking me to explain the same thing for the sixth time.</p><p>That was the gap.</p><p>My own second brain was organized. The agent’s memory was still trapped inside chats.</p><h3>The Pivot Was Simple: Write the Memory to the Vault</h3><p>So I changed the model.</p><figure><img alt="" src="https://cdn-images-1.medium.com/max/891/1*Imvqwq0WYmCagNW26dVpXg.png" /><figcaption>Architecture Diagram of my Obsidian Vault</figcaption></figure><p>Obsidian stopped being just my note-taking system. It became the place where the agent reads before working and writes back after working.</p><p>At the top, I keep a root CLAUDE.md that explains the vault structure, conventions, and note formats. That file acts as the bootstrap layer. It tells the agent what the vault is, how sections are organized, how files are named, and what kind of data belongs where.</p><p>Then I split the memory into two zones.</p><p>global/ holds memory that should survive across projects.</p><ul><li>knowledge/ for tools, APIs, patterns, and domain notes</li><li>decisions/ for cross-project ADR-lite decisions</li><li>learnings/ for post-mortems, mistakes, and practical lessons</li><li>templates/ for reusable note scaffolds</li><li>preferences/ for code style, workflow, and stack choices</li><li>contacts/ for people and relationship context when relevant</li></ul><p>projects/&lt;name&gt;/ holds memory that belongs to one active project.</p><ul><li>_project.md for the project overview</li><li>kanban.md for execution state</li><li>versions.md for the compact version table</li><li>changelog/ for detailed release entries</li><li>architecture/ for ADRs and diagrams</li><li>docs/ for specs, research, and guides</li><li>context/ for working context that should persist for a while</li><li>scratch/ for temporary thinking space</li></ul><p>The operating rule is easy to explain.</p><p>At session start, the agent reads global memory plus the relevant project memory.</p><p>At session end, it writes back what changed.</p><p>That one write-back rule is the whole game.</p><p>Without it, your vault becomes a nice archive. With it, the vault becomes working memory that compounds.</p><h3>Why This Works Better Than Chat Memory Alone</h3><p>The first benefit is obvious. I repeat myself far less.</p><p>If my agent already has a place to read my conventions, project state, and old decisions, I do not need to retype them every session. I can start from the task, not from the preamble.</p><p>The second benefit matters even more. The agent reads cleaner context.</p><p>A markdown note called decisions/api-versioning.md is a much better memory object than a buried paragraph from three days ago inside a chat that also contains shell output, debugging guesses, and a failed refactor. Same information. Different signal-to-noise ratio.</p><p>The third benefit is transfer.</p><p>This is where the vault starts feeling different from a normal repo setup. Let’s say two projects touch the same technical area. One project taught the agent that a certain API has weird pagination limits. Another project now needs that same API family. If the learning lives only in chat history, it is gone or inaccessible. If it lives in global/knowledge/ or global/learnings/, the next project can reuse it immediately.</p><p>And that is the real point. Good memory should travel when the knowledge travels.</p><h3>The Best Things to Store Are Not the Obvious Ones</h3><p>At first I thought the vault should mostly store polished documentation.</p><p>Wrong.</p><p>The most useful notes are often the messy ones that change future decisions.</p><p>Examples:</p><ul><li>a failed implementation attempt and why it failed</li><li>a naming convention that saved me from breaking Obsidian links</li><li>a project-level decision to keep YAML declarative instead of rebuilding a programming language by accident</li><li>a note that one workflow belongs in scratch/ until it survives real usage</li><li>a short learning that one project’s architecture pattern is reusable elsewhere</li></ul><p>These are small pieces of memory, but they save a lot of wasted motion.</p><p>I noticed this on 31 March when I wrote down the first version of the extended memory architecture for Claude Code. The structure itself was useful, sure. But the important part was what it implied: the agent now had a stable place for global knowledge, decisions, and learnings, instead of treating each session like an isolated event.</p><p>That changed how I work with it.</p><p>When a session produces something that would help a future session, it belongs in the vault. Not in my head. Not in the scrollback.</p><h3>This Also Fixes the Cross-Project Blind Spot</h3><p>Most coding setups assume each project is its own island.</p><p>Real work is not like that.</p><p>My projects leak into each other all the time. A documentation habit from one project improves another. A research note from a trading system changes how I think about monitoring or versioning somewhere else. A content workflow teaches me how to design reusable templates for project docs. Even my journaling system matters because it creates a timeline of what was built, what changed, and when the pivot happened.</p><p>The vault gives the agent a map of those connections.</p><p>That matters because agents are great at local execution and bad at implicit continuity. They will do exactly what is in front of them. If the memory layer is fragmented, the work stays fragmented too.</p><p>Once I moved memory into Obsidian, related projects stopped feeling disconnected. The agent could pull context from a shared place, then apply it locally where it mattered.</p><blockquote>I’m Hugo, a freelance Data Scientist specializing in AI for Construction. I build intelligent systems for a living, and apparently also for my note-taking. Find me on <a href="https://www.linkedin.com/in/hugo-sequier/">LinkedIn</a> or on my <a href="https://linktr.ee/sequierh">Linktree</a>.</blockquote><img src="https://medium.com/_/stat?event=post.clientViewed&referrerSource=full_rss&postId=b49b3104b386" width="1" height="1" alt="">]]></content:encoded>
        </item>
        <item>
            <title><![CDATA[Autoresearch Beyond ML: How I Adapted Karpathys Loop to Trade Prediction Markets]]></title>
            <link>https://medium.com/@sequierh/autoresearch-beyond-ml-how-i-adapted-karpathys-loop-to-trade-prediction-markets-b083be926aa1?source=rss-ba46bfc4582e------2</link>
            <guid isPermaLink="false">https://medium.com/p/b083be926aa1</guid>
            <category><![CDATA[automation]]></category>
            <category><![CDATA[software-development]]></category>
            <category><![CDATA[artificial-intelligence]]></category>
            <category><![CDATA[trading]]></category>
            <category><![CDATA[machine-learning]]></category>
            <dc:creator><![CDATA[Hugo Sequier]]></dc:creator>
            <pubDate>Tue, 17 Mar 2026 12:53:50 GMT</pubDate>
            <atom:updated>2026-03-17T12:53:50.399Z</atom:updated>
            <content:encoded><![CDATA[<h4>Fix the evaluator. Search the strategy space. That’s the whole idea.</h4><figure><img alt="" src="https://cdn-images-1.medium.com/max/1024/1*jGFtnUhQXp5dmY322RYn1A.jpeg" /></figure><p>On March 8, Andrej Karpathy open-sourced a ~630-line Python script called autoresearch. Within hours, Shopify CEO Tobi Lütke ran it on a 0.8B parameter model and reported a +19% score improvement after 8 hours and 37 experiments. By the next morning, people on Twitter were sharing results where the loop had independently rediscovered techniques like RMSNorm and tied embeddings, optimizations that took human researchers years to formalize.</p><p>I saw those results and thought: this has nothing to do with ML.</p><p>The ML part is just the current application. The architecture underneath is something else entirely. I spent the following week proving it by building my own version for trading on crypto prediction markets.</p><h3>What Autoresearch Actually Does</h3><p>You give it a training setup and an instruction prompt. An LLM agent modifies the code, trains for 5 minutes on a single GPU, checks if the result improved, keeps the change or discards it, and loops again. About 12 experiments per hour.</p><p>But the interesting part is what it does NOT do.</p><p>It doesn’t let the agent rewrite the evaluation metric. It doesn’t let it change the dataset. The agent can only touch the model architecture and hyperparameters within a fixed experimental setup.</p><p>This constraint is the whole point.</p><h3>Fixed Surface, Mutable Surface</h3><p>Strip away the ML specifics and you get two layers:</p><p><strong>Fixed surface</strong>: data preparation, evaluation function, scoring formula, temporal splits. These anchor comparability. If you change them mid-search, every previous result becomes meaningless.</p><p><strong>Mutable surface</strong>: the things you’re searching over. In Karpathy’s case, model architecture tweaks. In my case, trading strategy parameters.</p><p>Most people who try to automate research let the agent touch everything. Evaluator included. That’s how you get a system that scores 95% on its own benchmark and fails in production. The agent optimized the test, not the solution.</p><p>Keeping the evaluator frozen means every candidate gets judged on exactly the same terms.</p><h3>This Pattern Works Everywhere</h3><p>Once you see the fixed/mutable split, you notice it applies to problems that have nothing to do with neural networks.</p><p>Trading strategy search: fixed replay data, execution simulator, fee model. Mutable: entry thresholds, position sizing, timing windows.</p><p>Regulatory compliance: fixed floor plan data, measurement functions, legal text. Mutable: classification rules, compliance thresholds. Generate rule variants, evaluate against known-good annotations, keep the ones that match expert judgments.</p><p>Game AI tuning: fixed game engine, opponent pool, match simulator. Mutable: agent behavior parameters. Same loop.</p><p>The pattern works anywhere you have a repeatable evaluation function, a bounded search space, a way to generate candidates, and temporal splits to catch overfitting.</p><h3>My Version: Autoresearch for Polymarket</h3><p>I trade on Polymarket. Binary options on whether BTC will be above or below a strike price at a specific time. Markets settle every 5 minutes. Payout is $1.00 or $0.00.</p><p>I’d been trying to find a profitable strategy for months. Settlement Arbitrage, order book imbalances, directional bets near expiry. The pattern was always the same: a strategy would look robust on paper trading, I’d get confident, switch to real money, and it’d work for a day. Then the next day it’d lose everything back. No backtesting infrastructure, no systematic way to compare variants. Just me staring at paper trading results, convincing myself the edge was real, and getting burned when it wasn’t.</p><p>When Karpathy released autoresearch, I saw the fix. Within the week, I built a bronze dataset recording every BTC 5-minute market from Binance, Coinbase, and Polymarket order books. For the first time I had replay data. And with replay data, I could build a proper bounded research loop.</p><p><strong>Fixed surface</strong>: a data prep module joins exchange and Polymarket order book data into unified snapshots. A backtest module simulates execution with realistic fees. A splits module defines temporal train, validation, and test periods.</p><p><strong>Mutable surface</strong>: a training module contains multiple strategy implementations with ~20 registered baseline variants. A families module defines several bounded search spaces, each with a written thesis explaining what it’s trying to do and what parameters it’s allowed to mutate.</p><p>Three explicit roles in the loop. A Generator creates deterministic mutations from parent strategies, seeded and deduplicated. A Reviewer rejects candidates that violate family constraints before any expensive evaluation. A Selector runs survivors through train, then holdout, then compares against parents.</p><p>One command:</p><pre>py -3 -m autoresearch research-cycle \<br>  --root data/lake/bronze --asset btc_5m \<br>  --family [family_name] --population 24 --survivors 6</pre><p>24 candidates generated, reviewed, evaluated. 6 survive. Runs in minutes, not hours, because prediction market backtests are cheaper than GPU training.</p><figure><img alt="" src="https://cdn-images-1.medium.com/max/790/1*NxUjfiZx9W3A0VCJk9ntYg.png" /><figcaption>Diagram generated with Gemini 3.1 Canvas</figcaption></figure><h3>What the Loop Taught Me</h3><p>The first research cycle produced something I didn’t expect. The loop didn’t just find better parameters. It invalidated assumptions I’d been carrying for months.</p><p>I’d spent weeks optimizing exit logic: stop losses, take-profit levels, time-based exits. The loop showed that position sizing explained most of the P&amp;L variance, while exit timing contributed surprisingly little. I was polishing the wrong knob.</p><p>The best candidate from one family got there by loosening a filter I thought was essential. I would never have tried that manually. It felt wrong. The data said otherwise.</p><p>Another winner had a win rate below 50%. Worse than a coin flip. But it was profitable because the payoff asymmetry compensated. A human researcher with a spreadsheet would have filtered it out immediately on win rate alone. That’s the kind of finding a bounded loop surfaces.</p><p>Neither of these candidates beat my existing benchmark. The loop confirmed the benchmark was strong, which is also useful information. I now have a promotion pipeline (stress testing under adverse scenarios, portfolio correlation analysis) to evaluate whether new candidates add value as complements rather than replacements.</p><h3>Why No AI Agent in the Loop</h3><p>The obvious question: Karpathy’s version uses an LLM to generate code mutations. Why didn’t I?</p><p>Because I didn’t want an unconstrained AI agent optimizing a noisy backtest loop.</p><p>The btc_5m problem is narrow. The gap between offline backtest and live execution is already large. An LLM inside the inner loop would very likely learn to exploit backtest quirks instead of finding robust edge.</p><p>“Candidate 004 changed one filter threshold from X to Y” is something I can read, understand, and verify. “The model rewrote half the strategy” is not.</p><p>If the evaluator, the data prep, and the split logic change between runs, every previous result becomes meaningless. Bounded families with deterministic seeds are easy to reproduce, diff, and publish. An LLM-driven loop adds token cost, prompt tuning, latency, and more failure modes before I even trust the offline selection itself.</p><p>At this stage, the bottleneck is not creativity. I have plenty of strategy ideas. What I don’t have is confidence that any of them survive live conditions.</p><p>Once I’ve tested the strategies I have in mind and built enough trust in the offline evaluator, I will integrate an AI agent into the loop. But on my terms: AI suggests new family ideas, humans turn them into explicit bounded mutation spaces, and the fixed evaluator decides whether they survive. AI stays in the hypothesis layer, not in the trust layer.</p><p>You earn the right to automate a step by doing it manually first.</p><h3>Nothing Magic Here</h3><p>There is nothing magic about this system. Backtest environments and live environments are always very different. Fees are approximated. Execution timing is idealized. Order book depth in replay isn’t the same depth you’ll face when your real order hits the market.</p><p>Autoresearch is very good at removing assumptions, systematically trying things you wouldn’t try manually, and killing strategies that only look good because you never tested them on holdout data. It will not find you the strategy that makes you a millionaire in one loop.</p><p>And while I’m at it: avoid the Twitter larp articles. “How this strategy makes $589/day.” “How this quant turned Autoresearch into a Polymarket bot that turned $30 into $60,000.” 99% of them are fake. Fake data, storytelling layered over someone else’s Polymarket account screenshot, zero reproducibility.</p><p>If you actually want to build a Polymarket bot, start by creating a repo on GitHub and try it yourself. Record your own data. Write your own evaluator. Watch your strategies fail on holdout. Then you’ll understand why all those articles are fiction, and why having an edge is way more complicated than asking Claude to make you rich.</p><blockquote>I’m Hugo, a freelance Data Scientist specializing in AI for Construction. I build intelligent systems for a living, and apparently also for my note-taking. Find me on <a href="https://www.linkedin.com/in/hugo-sequier/">LinkedIn</a> or on my <a href="https://linktr.ee/sequierh">Linktree</a>.</blockquote><img src="https://medium.com/_/stat?event=post.clientViewed&referrerSource=full_rss&postId=b083be926aa1" width="1" height="1" alt="">]]></content:encoded>
        </item>
        <item>
            <title><![CDATA[The Impostor Loop: Why Vibecoding Made Me Feel Like a Fraud]]></title>
            <link>https://medium.com/@sequierh/the-impostor-loop-why-vibecoding-made-me-feel-like-a-fraud-a24a2a162971?source=rss-ba46bfc4582e------2</link>
            <guid isPermaLink="false">https://medium.com/p/a24a2a162971</guid>
            <category><![CDATA[ai]]></category>
            <category><![CDATA[software-development]]></category>
            <category><![CDATA[productivity]]></category>
            <category><![CDATA[self-improvement]]></category>
            <category><![CDATA[vibe-coding]]></category>
            <dc:creator><![CDATA[Hugo Sequier]]></dc:creator>
            <pubDate>Thu, 12 Mar 2026 13:01:03 GMT</pubDate>
            <atom:updated>2026-03-12T14:24:16.248Z</atom:updated>
            <content:encoded><![CDATA[<h4>I ship faster than ever. I’ve never felt less competent.</h4><figure><img alt="" src="https://cdn-images-1.medium.com/max/1024/0*S9Ded9vpGxkNoRee" /><figcaption>Image by <a href="https://unsplash.com/fr/@yejun0405">Joel Lee</a> from <a href="https://unsplash.com/fr/photos/une-personne-assise-sur-un-canape-avec-un-livre-sur-la-tete-oOo1hf6-uhQ">Unsplash</a></figcaption></figure><p>I’ve been writing code for six years. Data science for three. I started the way most people my age did: writing algorithms on paper before touching a keyboard. Understanding loops, recursion, data structures by drawing them out. Then building things the hard way, line by line, bug by bug.</p><p>I’ve lived through every wave since. ChatGPT drops, and suddenly everyone is copy-pasting code from a chatbox. Then Cursor makes it seamless, the AI lives inside your editor. Now Claude Code, Codex, agents that write entire features autonomously. Each step removed a layer of friction. Each step removed a layer of you from the process.</p><p>Last Tuesday, I caught myself playing chess. Not during a break. Between two Claude prompts, while waiting for my AI coding assistant to generate a rules engine for an architectural compliance system I’ve been building for months.</p><p>I’d been doing this all day. Prompt. Wait. Check the output. Adjust. Prompt again. Wait. Open chess. Close chess. Check output.</p><p>I shipped more code that day than I used to ship in a week. And I felt like I’d done absolutely nothing.</p><h3>The prompt-and-wait loop</h3><p>Here’s what my typical workday looks like now as a freelance data scientist.</p><p>I wake up. I open VSCode. I write a prompt describing what I need: a new detection pipeline, a data processing module, an API endpoint. The AI generates it. I review, tweak the prompt, maybe run it again. The feature works. I move to the next one.</p><p>Between each prompt, there’s a gap. Sometimes two minutes, sometimes ten. My brain has nothing to do during those gaps. So it reaches for the nearest source of stimulation. Chess. Twitter. YouTube. Random scrolling.</p><p>I tried counting once. In a single afternoon, I context-switched to my phone 23 times. Every switch was between two prompts. Every switch was because my brain was bored.</p><p>The old workflow was different. Problem shows up. I think about it. I try something. It breaks. I debug. I try again. I read documentation. I stare at the ceiling for five minutes. Something clicks. I write the solution. That loop took hours. But my brain was engaged the entire time.</p><p>Now the loop is:</p><blockquote>Describe the problem, press enter, wait.</blockquote><h3>Why your brain calls you a fraud</h3><p>The classic impostor syndrome goes like this: I got lucky, I don’t deserve this, someone will find out. The vibecoding version is different. The results are real. The code works. The features ship. But you didn’t do the work. Not the way your brain defines “work.”</p><p>Your brain has a simple equation: effort = legitimacy. You struggled with a bug for four hours and fixed it? You earned that fix. You learned something. You can explain it. You could do it again.</p><p>But when you prompt an AI and it generates the solution in 30 seconds? The feature works identically. The end result is the same. But your brain didn’t earn it. There was no struggle, no breakthrough moment, no satisfaction of figuring it out yourself.</p><p>So it starts whispering. You don’t really understand this codebase. You couldn’t rebuild this without the AI. You’re not a real engineer anymore.</p><p>And the worst part? It might be partially right. I realized I couldn’t explain some parts of my own codebase because I never had to think through them. The AI wrote them, I reviewed them, they worked, I moved on. Reviewing is not understanding.</p><h3>The patience trap</h3><p>The prompt-and-wait loop does something else to your brain. It recalibrates your sense of time.</p><p>When you get results in 30 seconds, everything slower feels broken. I started noticing this pattern in my own behavior: I’d test a new trading strategy for two days, see mixed results, and switch to a different approach. I’d start a side project, spend four days on it, and drop it because it wasn’t showing results fast enough. I’d try a new tool and abandon it the same afternoon. Even with Chess, I used to play Rapid games, now I play bullet because I feel like 10 minutes its too long.</p><p>The pattern is always the same. Try something. No immediate result. Next.</p><p>Before AI coding tools, building a feature took a week. You expected it to take a week. Your patience was calibrated to that timeline. Now, building a feature takes an afternoon. And your patience has shrunk to match. But not everything in life responds to prompts. Finding product-market fit doesn’t. Building an audience doesn’t. Developing real expertise doesn’t.</p><p>I looked at my journal and counted: in 11 days, I had started or touched 8 different projects. I’d made meaningful progress on exactly two.</p><h3>The productivity FOMO nobody warned you about</h3><p>There’s another layer to this that I didn’t expect.</p><p>When you know you can build anything in an afternoon, every idea becomes a temptation. You scroll Twitter and see someone launch a SaaS. You could build that. Someone shares a trading bot framework. You could fork that and improve it. A new API drops. You could integrate it into something cool by tonight.</p><p>The possibilities are genuinely infinite now. And that’s the problem.</p><p>Before AI coding tools, starting a project had a cost. Weeks of setup, learning the stack, writing boilerplate. That friction was a natural filter. Only ideas you cared about enough survived the boring phase.</p><p>Now there’s no boring phase. You go from idea to working prototype in hours. So you start everything. A plugin here, an agent framework there, a newsletter, a dashboard, a bot. Each one is 20% done and feels exciting for exactly one afternoon.</p><p>I know I can build a Shopify plugin. I know I can build a newsletter system. I know I can build an AI agent orchestrator. I’ve proven it to myself by starting all of them. But proving you <em>can</em> build something and actually shipping it are two different things. The first gives you a dopamine hit. The second requires months of boring, repetitive work that no prompt can shortcut.</p><p>The FOMO isn’t about missing out on opportunities. It’s about missing out on your own potential. You’re hyper-aware of everything you <em>could</em> be doing, so everything you <em>are</em> doing feels insufficient. You’re scrolling through your own capabilities like a feed, consuming the idea of productivity without actually producing anything.</p><p>I had five projects at 20% completion. Total revenue from all five combined: zero.</p><p>And social media makes it worse. Way worse.</p><p>Open Twitter on any given morning and your feed is a highlight reel of people shipping. Someone launched an AI wrapper and made $10K in a week. Someone else built a full SaaS in a weekend with Cursor. A 19-year-old just raised a seed round for something they vibecoded in three days. Everyone is shipping. Everyone is making money. Everyone except you.</p><p>Twitter has become the new Instagram. Except instead of comparing abs and vacations, we’re comparing repos and MRR screenshots. The currency changed, but the mechanism is identical: you’re comparing your behind-the-scenes to everyone else’s highlight reel.</p><p>Here’s what the feed doesn’t show you. The 500 people who built the same wrapper and made nothing. The SaaS that got 12 users and was abandoned two weeks later. The seed round that led nowhere. You only see the survivors, never the graveyard. That’s textbook survivorship bias, and the AI tools space is drowning in it.</p><p>Every day there’s a new framework, a new model, a new way to vibecode faster. Each one comes with a thread showing what someone built with it. Each thread makes you feel like you’re falling behind. But most of the people posting those threads are in the same loop you are: starting things, showing the exciting part, then quietly moving on to the next shiny tool before the boring part starts.</p><p>Nobody tweets “Day 47 of maintaining my SaaS, fixed a timezone bug in the billing module.” That doesn’t get likes. What gets likes is “I just built X in 2 hours with Y.” The incentive structure rewards starting, not finishing. And when that’s all you see, you start believing that starting is the game.</p><p>It’s not. Shipping is. But shipping is slow, messy, and invisible on social media.</p><h3>We’ve always delegated. This time it’s different.</h3><figure><img alt="" src="https://cdn-images-1.medium.com/max/1024/1*g2CZYl5zHPHk2PukI2tvLg.avif" /><figcaption>Image by <a href="https://unsplash.com/fr/@museumsvictoria">Museums Victoria</a> from <a href="https://unsplash.com/fr/photos/photo-en-niveaux-de-gris-dun-homme-effectuant-des-travaux-mecaniques-FOPuzIKOnA0">Unsplash</a></figcaption></figure><p>Humans have been outsourcing effort since the first plow. The industrial revolution moved muscle work to machines. Assembly lines turned craftsmen into operators. Spreadsheets replaced rooms full of accountants. Every generation finds something to delegate, and every generation panics about it for a while, then adapts.</p><p>But there’s a pattern worth noticing. We delegated physical labor first. Then repetitive calculation. Then information retrieval. Each wave moved up the stack, closer to what we considered “thinking.”</p><p>Now we’re delegating the thinking itself. Or at least, a version of it. The version that involves translating an idea into working code, line by line.</p><p>The factory worker in 1920 didn’t feel like a fraud because a machine stamped metal faster than his hands could. The work had moved, but his role was clear: operate the machine, maintain it, decide what it produces. The machine was a tool.</p><p>Vibecoding feels different because the boundary is blurry. When the AI writes a function, did you write it or did the AI? When you design the system but the AI implements every piece, are you the engineer or the client? The factory worker knew he wasn’t the machine. We’re not so sure anymore.</p><p>That ambiguity is new. And nobody has a framework for it yet because we’re the first generation living through cognitive delegation at this scale.</p><h3>Nothing is lost</h3><p>I don’t have this figured out. I literally just started changing things this week. But here’s the hypothesis I’m testing.</p><p><strong>Mornings without AI.</strong> Not because AI is bad, but because my brain needs to work on hard problems without assistance. I pick one task that requires actual thinking: designing an architecture, analyzing data by hand, writing (like this article). The AI can’t do the thinking for me on these. I have to sit with the discomfort of not knowing the answer immediately.</p><p><strong>Logging decisions, not just outputs.</strong> My daily journal used to say things like “built the rules engine.” Now I’m trying to capture what I actually contributed: “chose to abandon the RETE algorithm because it was overkill for our use case and designed a simplified approach instead.” That’s the part the AI didn’t do. That’s the part that matters.</p><p><strong>Setting minimum evaluation periods.</strong> Before starting anything new, I write down: “I will judge this after X days/trades/attempts, not before.” If the threshold isn’t met, I’m not allowed to conclude it doesn’t work. This one is hard. My brain wants the verdict now.</p><p><strong>Filling the gaps.</strong> The dead time between prompts is where the damage happens. I’m experimenting with batching: instead of prompt-wait-scroll-prompt, I prepare the next task while the current one runs. Brief the next problem, sketch the approach on paper, review old code. Keep the brain engaged.</p><h3>The identity shift nobody talks about</h3><p>Here’s what I think is actually going on, underneath all of this.</p><p>I used to be a coder. My identity was built on the ability to solve hard technical problems through sustained effort. That’s how I proved my value to myself and to clients.</p><p>Now I’m something else. A decision-maker. An architect. Someone who knows which model to use, when to abandon an approach, how to design a system that works. The AI handles execution. I handle direction.</p><p>That’s a more valuable skill set. Clients pay more for someone who knows what to build than for someone who can build fast. But my brain hasn’t caught up. It still measures my worth by hours of struggle, not by quality of decisions.</p><p>Maybe the impostor feeling isn’t a bug. Maybe it’s the growing pain of becoming a different kind of engineer. One who thinks more and types less.</p><p>I don’t know yet. Ask me in six months.</p><blockquote>I’m Hugo, a freelance Data Scientist specializing in AI for Construction. I build intelligent systems for a living, and apparently also for my note-taking. Find me on <a href="https://www.linkedin.com/in/hugo-sequier/">LinkedIn</a> or on my <a href="https://linktr.ee/sequierh">Linktree</a>.</blockquote><img src="https://medium.com/_/stat?event=post.clientViewed&referrerSource=full_rss&postId=a24a2a162971" width="1" height="1" alt="">]]></content:encoded>
        </item>
        <item>
            <title><![CDATA[How I Keep Claude Code Fast With Zero Plugins]]></title>
            <link>https://medium.com/@sequierh/how-i-keep-claude-code-fast-with-zero-plugins-44a1ad9bd8cb?source=rss-ba46bfc4582e------2</link>
            <guid isPermaLink="false">https://medium.com/p/44a1ad9bd8cb</guid>
            <category><![CDATA[ai]]></category>
            <category><![CDATA[software-development]]></category>
            <category><![CDATA[ai-agent]]></category>
            <category><![CDATA[code]]></category>
            <category><![CDATA[claude-code]]></category>
            <dc:creator><![CDATA[Hugo Sequier]]></dc:creator>
            <pubDate>Tue, 03 Mar 2026 13:01:02 GMT</pubDate>
            <atom:updated>2026-03-03T13:01:02.033Z</atom:updated>
            <content:encoded><![CDATA[<h4>No MCP servers, no extensions, no magic. Just markdown files and a 4-step workflow.</h4><figure><img alt="" src="https://cdn-images-1.medium.com/max/1024/1*bU1cYO2FcdU8-88Jx2WVKw.jpeg" /><figcaption>Image generated with Nano Banana 2</figcaption></figure><p>Last week someone in a Meetup asked me to share my Claude Code setup. I sent my github repository. The response was “wait, where are your MCP servers?” Nowhere. I don’t use any.</p><p>No MCP servers. No IDE plugins beyond the stock VS Code extension. No custom integrations. My entire Claude Code configuration is markdown files in a .claude/ folder and a CLAUDE.md at the root. That&#39;s it. And it handles production projects — a computer vision pipeline for construction companies, a crypto trading bot, a full-stack app, without breaking a sweat.</p><p>I’m not against MCP or plugins. I’ve looked at them. I chose not to use them. Here’s why, and what I do instead.</p><h3><strong>The Problem Nobody Talks About</strong></h3><p>Claude Code reads your entire conversation to build context. Every message, every file it opened, every command it ran. As your session grows, two things happen: responses get slower, and your bill gets fatter.</p><p>Most people try to fix this by adding more tools. MCP servers that fetch docs automatically. Plugins that index your codebase. Custom integrations that pipe data in from everywhere. The intent is good: give Claude more context so it works better.</p><p>But more context is the problem, not the solution. Every extra tool dumps more tokens into the conversation. That MCP server fetching your database schema? That’s tokens. The plugin pulling in related files? More tokens. You end up with a context window stuffed full of information Claude didn’t ask for, paying for it in both latency and cost.</p><p>And the industry knows it. People started using MCP servers, realized they were eating context windows alive, so now we’re seeing new plugins and architectures designed to make MCP consume less. New CLIs are popping up every week, each promising a smarter way to manage context. But look at what’s actually happening: we’re stacking layers on top of layers on top of layers. A tool to manage the tool that manages the tool that talks to your AI. At some point you have to ask: what if the first layer was the wrong move?</p><p>The fix isn’t giving Claude more stuff. It’s giving Claude the right stuff, fast</p><h3>One Markdown File Per Feature</h3><p>Here’s the core idea. For each feature in my project, I maintain a single markdown file at .claude/{feature}/CLAUDE.md. It contains everything Claude needs to work on that feature: where the code lives, how it&#39;s structured, what patterns to follow, and what traps to avoid.</p><p>A real one from my project looks like this:</p><pre># Authentication - Overview<br><br>## Quick Reference<br>- Key files: src/auth/, src/middleware/auth.ts<br>- Dependencies: jsonwebtoken, bcrypt<br>- Patterns: Repository pattern, JWT with refresh tokens<br><br>## Architecture<br>Auth uses a layered approach: routes -&gt; controller -&gt; service -&gt; repository.<br>Tokens are stored in HTTP-only cookies.<br><br>## Conventions<br>- All auth errors return 401/403 with a standard error shape<br>- Password hashing uses bcrypt with 12 rounds<br><br>## Gotchas<br>- The refresh token rotation invalidates all previous tokens<br>- Rate limiting is per-IP, not per-user</pre><p>That’s maybe 20 lines. Claude reads it in under a second. Compare that to what happens without feature docs: Claude opens src/auth/, reads 8 files, scans imports, tries to infer the patterns, maybe opens a few test files to understand the expected behavior. That&#39;s hundreds of lines of source code burned into your context window, and Claude still might miss the gotcha about token rotation.</p><p>With the doc, Claude knows the architecture, the conventions, and the pitfalls before it touches a single source file. It writes code that fits on the first try instead of the third.</p><p>I maintain about 10 of these across my projects. Creating one takes 5 minutes. Updating it after a big change takes 1. The return on that investment is absurd.</p><h3>The 4-Step Workflow That Prevents Rework</h3><p>Good docs are half the equation. The other half is making sure Claude actually reads them before doing anything.</p><p>I use a workflow I call EPCT: Explore, Plan, Code, Test. Every task goes through these four steps, enforced by a slash command.</p><pre>/epct add user authentication</pre><p><strong>Explore.</strong> Claude reads the relevant .claude/*/CLAUDE.md files first. Then it scans the codebase to understand what already exists. It identifies patterns, lists files that will be affected, flags potential conflicts. No code written yet.</p><p><strong>Plan.</strong> Claude produces a concrete plan: files to create or modify, step-by-step implementation, edge cases to handle. Then it stops and waits for my approval. This is the step that saves the most time. I’ve caught misunderstandings here that would have meant 20 minutes of wasted code and another 20 minutes of debugging. A 30-second review of the plan costs nothing. A wrong implementation costs everything.</p><p><strong>Code.</strong> After I approve, Claude writes the code following the plan and the patterns from the feature docs. Because it already knows the conventions, it doesn’t invent new patterns or contradict existing ones.</p><p><strong>Test.</strong> Claude runs the test suite, adds tests for the new code, and verifies nothing broke.</p><p>The whole thing is a single slash command. I also have individual commands when I only need one step:</p><figure><img alt="" src="https://cdn-images-1.medium.com/max/515/1*yDB2fY-HNUoUYMv7ob-ZdA.png" /></figure><p>These are just markdown files in .claude/commands/. Each one is a prompt template that tells Claude exactly how to approach the task. No plugin system, no API, no framework. Markdown files that Claude reads as instructions.</p><h3>What This Looks Like in Practice</h3><p>My project structure:</p><pre>my-project/<br>├── CLAUDE.md                        # Root instructions (always loaded)<br>├── .claude/<br>│   ├── settings.json                # Permissions<br>│   ├── commands/                    # Slash commands (markdown files)<br>│   │   ├── epct.md<br>│   │   ├── plan.md<br>│   │   ├── fix.md<br>│   │   ├── review.md<br>│   │   ├── refactor.md<br>│   │   ├── test.md<br>│   │   ├── new-doc.md<br>│   │   └── update-docs.md<br>│   ├── auth/CLAUDE.md               # Feature docs<br>│   ├── payments/CLAUDE.md<br>│   └── notifications/CLAUDE.md<br>└── src/<br>    └── ...</pre><p>The CLAUDE.md at the root is always loaded by Claude Code when you start a session. Mine contains the project structure, coding conventions, and pointers to the feature docs. Think of it as the table of contents.</p><p>The feature docs in .claude/{feature}/CLAUDE.md get loaded when Claude runs the Explore step of EPCT. Claude knows which docs to read because the root CLAUDE.md lists them.</p><p>The slash commands in .claude/commands/ are prompt templates. When I type /epct add payment webhooks, Claude Code loads epct.md, injects my task description, and follows the instructions. The instructions say &quot;read the relevant feature docs first, then plan, then wait for approval.&quot; Claude does exactly that.</p><p>No runtime dependencies. No servers to start. No config files to debug. If you can write a markdown file, you can build this setup.</p><h3>What I Deliberately Don’t Use</h3><p><strong>MCP servers.</strong> They’re powerful. They can connect Claude to databases, APIs, documentation sites, all kinds of external data. But every MCP call adds tokens to the context, and most of the time I don’t need live data from external sources while coding. When I do, I just tell Claude to run a curl command or check a URL. That’s one tool call, not a persistent connection draining tokens.</p><p><strong>IDE plugins beyond the basics.</strong> I use the standard VS Code extension for Claude Code. That’s it. No code indexing plugins, no AI-powered autocomplete layers on top of Claude, no custom sidebar panels. Each of these is another thing that can break, another thing that needs updating, another integration to debug when something goes sideways.</p><p><strong>Agent orchestration frameworks.</strong> I wrote about using multi-agent setups in a previous article. They have their place. But for daily feature work, a single Claude Code session with good docs outperforms a fleet of poorly-documented agents. Every time.</p><p>The pattern I keep seeing: people add complexity to compensate for missing documentation. Your AI agent keeps misunderstanding the codebase? Add an MCP server that indexes it! It keeps forgetting conventions? Add a plugin that enforces them! Or… write a 20-line markdown file that explains both. One costs ongoing maintenance and token overhead. The other costs 5 minutes once.</p><h3>Managing the Docs</h3><p>The docs are only useful if they stay current. I have two slash commands for that:</p><pre>/new-doc payments       # Generate docs for a new feature<br>/update-docs payments   # Regenerate after significant changes</pre><p>Both are just markdown prompt templates. /new-doc tells Claude to scan the feature&#39;s source code and produce a CLAUDE.md following a standard template. /update-docs tells Claude to read the existing doc, compare it to the current code, and update what changed.</p><p>I run /update-docs after any session where I made significant architectural changes. Takes about 30 seconds. If I forget, the Explore step of EPCT usually catches the drift anyway, because Claude reads both the doc and the actual code.</p><h3>The Config Is Public</h3><p>I’ve open-sourced my entire Claude Code configuration. The CLAUDE.md, the slash commands, the feature doc template, the settings.json with permission rules. You can grab it, drop it into your project, and start using it today.</p><figure><img alt="" src="https://cdn-images-1.medium.com/max/1024/1*bKzuN6-eFiWQDK40Zrm_5w.png" /><figcaption><a href="https://github.com/Hugo-SEQUIER/claude-config">https://github.com/Hugo-SEQUIER/claude-config</a></figcaption></figure><p>The settings.json includes sensible defaults: read-only operations and test runners are allowed, .env files and destructive commands are blocked. Adjust to your needs.</p><h3>What I’d Tell You If You’re Starting Out</h3><p>Skip the plugin research. Skip the MCP server setup. Skip the “ultimate Claude Code configuration” YouTube videos.</p><p>Open your project. Create a CLAUDE.md at the root. Write down your project structure, your conventions, and the things that always trip you up. Then create a .claude/ folder and add a CLAUDE.md for your two or three most complex features.</p><p>Start using /epct for your next task. Read the plan Claude produces. Approve it or correct it. Watch how much less back-and-forth you need when Claude already knows your codebase.</p><p>The best tool for Claude Code isn’t another tool. It’s a well-written doc.</p><blockquote>I’m Hugo, a freelance Data Scientist specializing in AI for Construction. I build intelligent systems for a living, and apparently also for my note-taking. If you want to chat about Obsidian, AI workflows, or Second Brain architectures, find me on <a href="https://www.linkedin.com/in/hugo-sequier/">LinkedIn</a> or on my <a href="https://linktr.ee/sequierh">Linktree</a>.</blockquote><img src="https://medium.com/_/stat?event=post.clientViewed&referrerSource=full_rss&postId=44a1ad9bd8cb" width="1" height="1" alt="">]]></content:encoded>
        </item>
        <item>
            <title><![CDATA[How I Turned OpenClaw into a MVP Agency]]></title>
            <link>https://medium.com/@sequierh/how-i-use-openclaw-to-ship-mvps-for-20-5-ai-agents-1-python-script-and-a-6-vps-6ecbf6fbeb31?source=rss-ba46bfc4582e------2</link>
            <guid isPermaLink="false">https://medium.com/p/6ecbf6fbeb31</guid>
            <category><![CDATA[ai]]></category>
            <category><![CDATA[mvp]]></category>
            <category><![CDATA[openclaw]]></category>
            <category><![CDATA[ai-agent]]></category>
            <category><![CDATA[automation]]></category>
            <dc:creator><![CDATA[Hugo Sequier]]></dc:creator>
            <pubDate>Tue, 24 Feb 2026 12:56:00 GMT</pubDate>
            <atom:updated>2026-03-13T13:30:56.474Z</atom:updated>
            <content:encoded><![CDATA[<h4>I set up 5 AI coding agents with OpenClaw on a cheap VPS, wrote a Python script to orchestrate them, and now I ship working apps while reviewing plans on my phone. Here’s how the whole thing works.</h4><figure><img alt="" src="https://cdn-images-1.medium.com/max/1024/1*OwqTVEF4nEPpArdwXmYarA.png" /></figure><p>Last Sunday I gave a presentation at a tech meetup in Da Nang. I walked through the architecture, explained how the agents are organized, showed the orchestration flow. 10 slides, 15 minutes. But a presentation only scratches the surface. You can’t really explain dependency resolution, escalation chains, and review loops in a slide deck without putting people to sleep.</p><p>So I wanted to write the full breakdown. The details that didn’t fit in the slides, the things that actually went wrong, and the real numbers.</p><h3>The Indie Hacker Problem</h3><p>I’m a freelance AI engineer. My day job is computer vision for construction companies. But I keep having side project ideas, and I never have time to build them properly.</p><p>Hiring devs for an MVP that might go nowhere? Too expensive. No-code tools? I hit walls the moment logic gets slightly custom. Vibe-coding with Claude Code? Actually works pretty well. I’ve shipped real features that way. But it still requires me to sit there, prompt after prompt, review after review.. Multiply that by an entire app and you’re back to the same problem: not enough hours.</p><p>So I tried a different approach: split the work across multiple specialized agents, each with a clear role, and write a script to make them work together.</p><h3><strong>What OpenClaw Is</strong></h3><p>OpenClaw is an open-source, self-hosted framework for running AI coding agents. You install it on your machine (I beg you, don’t run it on your local machine) or a VPS, configure agents with different roles, and they can read code, write code, run shell commands, and push to GitHub. Each agent gets its own workspace and its own personality file (called a SOUL.md) that defines what it does.</p><p>The framework handles the plumbing: agent sessions, a gateway API, Telegram and dashboard integrations, tool permissions. What makes my setup useful is the layer I built on top.</p><h3>From “Meh” to “Oh Shit”</h3><p>Most people who try AI agents stop at the obvious stuff. A personal chatbot on Telegram. An email assistant. Maybe a single coding agent for Q&amp;A.</p><p>I actually skipped OpenClaw the first time I saw it. Just another agent framework, I thought. The homepage showed the basic use cases: a personal chatbot on Telegram, an email assistant, a single coding agent for Q&amp;A. Stuff I could already do with Claude Code or a quick script. I closed the tab.</p><p>A few weeks later someone on X showed a multi-agent setup where agents were talking to each other. Agent A finishes a task, agent B reviews it, and if there’s a problem, agent A gets sent back to fix it automatically. No human in the loop unless something truly needs a decision. I looked at the framework again. OpenClaw supported all of that out of the box: multiple agents, shared workspaces, inter-agent communication, Telegram integration.</p><p>That’s when it went from “neat toy” to “wait, this actually ships code.”</p><figure><img alt="" src="https://cdn-images-1.medium.com/max/1024/1*7JRkbYEcjNLUDEJLCjDEZA.png" /></figure><h3>My 5 Agents</h3><figure><img alt="" src="https://cdn-images-1.medium.com/max/1024/1*EDdNDFJAn1H-tyDpiprtpQ.png" /></figure><p>Five agents. Not six. The orchestrator that coordinates them is a Python script, not an agent. That distinction matters because the orchestrator doesn’t think, doesn’t hallucinate, doesn’t get creative. It just follows rules.</p><p>All five agents run on cheap models through OpenRouter: Kimi 2.5 for the heavy work (planning, coding, review) and Minimax as a fallback. Token costs for an entire MVP land around $15. The PM agent is connected to Telegram so I can interact with it from my phone. The others are CLI-only, triggered by the orchestrator.</p><figure><img alt="" src="https://cdn-images-1.medium.com/max/1024/1*P6ZRZjLGruBSRRp62-wWpg.gif" /></figure><h3>The Setup: 10 Minutes, $6/Month</h3><p>The entire thing runs on a single Contabo VPS:</p><ul><li>6 vCPU, 12 GB RAM, 100 GB NVMe</li><li>Ubuntu 24</li><li>Cost: ~$6/month</li></ul><figure><img alt="" src="https://cdn-images-1.medium.com/max/797/1*hl-NOq95J7QGtqZ2EE9_6g.png" /><figcaption><a href="https://contabo.com/en/openclaw-hosting/">https://contabo.com/en/openclaw-hosting/</a></figcaption></figure><p>OpenClaw is installed globally via npm, the gateway runs as a systemd service, and each agent has its own workspace directory under <em>“~/.openclaw/”</em>. SSH access with ED25519 keys, UFW firewall open on two ports.</p><p>Setting up a new VPS from scratch takes about 10 minutes. Install OpenClaw, run the onboarding wizard, configure your agents, done. I access the dashboard through an SSH tunnel when I need it, but 90% of the time I just talk to the PM on Telegram.</p><h3>The Orchestrator: A Script, Not an Agent</h3><p>This is the part that makes everything work. Running 5 agents is easy. Making them collaborate without stepping on each other is the actual problem.</p><p>I wrote a Python script that acts as the coordinator. It doesn’t use an LLM. It’s a deterministic loop:</p><ol><li>Poll the KANBAN.md file in the repo every 60 seconds</li><li>Find the next task that’s ready (respecting dependency order: backend before frontend)</li><li>Spin up the right agent with the task ID</li><li>When the agent finishes, trigger Reviewer for code review</li><li>If Reviewer approves, merge. If Reviewer requests changes, send back to the dev agent (max 3 cycles before escalating to me)</li><li>When all priority tasks are done, trigger Content</li><li>Ping me on Telegram: “MVP done”</li></ol><p>The orchestrator also auto-syncs the KANBAN when it detects a git merge that wasn’t reflected yet. And it sends Telegram notifications directly via the API for status updates.</p><p>Why not make the orchestrator an agent too? Because I don’t want the thing deciding <strong>which</strong> tasks to work on based on vibes. Task ordering, dependency resolution, retry logic: these are deterministic problems. A “<em>while True”</em> loop with some <em>“if”</em> statements handles them better than any LLM.</p><h3>Public repo</h3><p><a href="https://github.com/Hugo-SEQUIER/openclaw-template">GitHub - Hugo-SEQUIER/openclaw-template</a></p><h3>The Template: Everything Baked In</h3><p>Every new project starts from the same repo template. That template contains:</p><ul><li>An <em>“IDEA.md”</em> file where I describe the app (this is all I write)</li><li><em>“.claude/commands/”</em> with skill definitions for each agent</li><li><em>“conventions/”</em> with coding standards, typing rules, git branching strategy</li><li>Pre-defined API contract structure so frontend and backend agents agree on interfaces</li></ul><p>The agents don’t start from zero. They start from a well-defined environment with clear rules. You write the IDEA.md. They do the rest.</p><h3>The Escalation Chain</h3><p>When an agent is stuck, it doesn’t spin in circles:</p><ul><li>Dev agent needs a product decision? Asks the PM agent.</li><li>Dev agent needs something external (API key, third-party service)? Sends me a Telegram message and stops working until I respond.</li><li>Reviewer blocked after 3 review cycles? Escalates to me.</li><li>PM unsure about scope? Asks me on Telegram.</li></ul><p>The hierarchy: Dev -&gt; PM -&gt; Hugo. No agent tries to solve a problem outside its role.</p><h3>Security</h3><p>Each GitHub repo gets its own SSH deploy key. The agents can only access repos where I’ve explicitly added the key. No global GitHub token floating around.</p><p>RLS (Row Level Security) on every Supabase table is mandatory and verified by the Reviewer agent during code review. This is non-negotiable in the conventions.</p><h3>The Workflow: From Idea to App</h3><figure><img alt="" src="https://cdn-images-1.medium.com/max/1024/1*8s9am1rZxDvkHrY-L2Xt4w.png" /></figure><p>Here’s what a new project looks like end-to-end:</p><p><strong>Step 1 </strong>(me, ~10 min): Create a repo from the template. Write an IDEA.md describing the app. Push it. Send the PM a Telegram message: <em>“New project, read the IDEA.”</em></p><p><strong>Step 2</strong> (PM, automatic): The PM reads the IDEA.md and generates an architecture document, a KANBAN with prioritized tasks, detailed specs for each task, and API contracts.</p><p><strong>Step 3</strong> (me, ~5 min): The PM pings me on Telegram with the plan. I review it. I say <em>“Go.”</em></p><p><strong>Step 4</strong> (orchestrator, automatic): Backend tasks first, frontend after. Reviewer checks every PR. Content agent writes store listings when the MVP is stable. I get pinged only when something needs my attention.*</p><p>15 minutes of my time. Then I wait.</p><h3>First Real Test: HerCompass</h3><figure><img alt="" src="https://cdn-images-1.medium.com/max/1024/1*ics4Yydb7fE4_u9UNLjVWg.png" /></figure><p>My first real project with this setup was HerCompass, a menopause symptom tracking app. I wrote the IDEA.md in about 15 minutes, described the core features (symptom logging, pattern tracking, daily check-in), pushed it, and told the PM to go.</p><p>What worked:</p><ul><li>The PM’s architecture doc was clean. Good separation between Supabase tables, sensible RLS policies, typed contracts between front and back.</li><li>Backend tasks completed without issues. Migrations, edge functions, auth flow.</li><li>The Reviewer caught real problems: missing RLS on one table, a type mismatch in an API contract.</li><li>The STOP step let me redirect the frontend agent twice when the UI approach didn’t match what I wanted.</li></ul><p>What didn’t:</p><ul><li>Race conditions between agents. The dev would start a new task while the Reviewer was still asking him to fix the previous one. Two branches diverging, merge conflicts, chaos.</li><li>The PM sometimes over-specced simple features. A settings page doesn’t need a 200-line spec.</li><li>Context window limits meant agents occasionally forgot earlier decisions in long sessions. Once I had to SSH in and push a Supabase function myself because the agent just… forgot to deploy it.</li></ul><p>But here’s the thing: each of these problems only happened once. The dev/Reviewer race condition? I added a lock in the orchestrator so a dev agent can’t pick up a new task until its previous PR is merged or closed. The forgotten deploy? Added a post-task checklist to the SOUL.md. Every bug in the pipeline becomes a two-line fix in the orchestrator or a new rule in the conventions. The system gets better with each project.</p><p>The MVP skeleton is working: auth, database, core screens, navigation. The agents wrote about 95% of the code.</p><h3>What I Actually Learned</h3><p><strong>Keep the orchestrator dumb.</strong> A Python script with a while loop and if statements. No LLM deciding which task to pick next. Deterministic task dispatch means predictable behavior, and predictable behavior means I can debug problems in 5 minutes instead of wondering why the AI decided to skip a task.</p><p><strong>The STOP step pays for itself every single time.</strong> Five minutes of plan review saves hours of wrong implementation.</p><p><strong>$20 per app, for real.</strong> VPS: $6/month. LLM tokens for one MVP: ~$15. GitHub, Supabase, Vercel: free tiers. Total: roughly $20. Even if you count the VPS across multiple projects it gets cheaper.</p><p><strong>Telegram as the interface was the right call. </strong>I review plans, approve tasks, and get status updates from my phone while walking around Da Nang. No need to SSH into the VPS unless something breaks.</p><p>What’s next? Shipping more MVPs, for clients and for myself. Every project exposes new edge cases in the orchestrator, new gaps in the conventions. But the foundation works. And it costs about $20 per app.</p><p>If you want to try this yourself, OpenClaw is open source. The hardest part isn’t the tooling. It’s writing good SOUL.md files, setting up conventions that agents actually follow, and accepting that you’ll spend the first two projects debugging your own rules rather than shipping features.</p><p>That part nobody tells you. But once it’s dialed in, it works.</p><blockquote>I’m Hugo, a freelance Data Scientist specializing in AI for Construction. I build intelligent systems for a living, and apparently also for my note-taking. If you want to chat about Obsidian, AI workflows, or Second Brain architectures, find me on <a href="https://www.linkedin.com/in/hugo-sequier/">LinkedIn</a> or on my <a href="https://linktr.ee/sequierh">Linktree</a>.</blockquote><img src="https://medium.com/_/stat?event=post.clientViewed&referrerSource=full_rss&postId=6ecbf6fbeb31" width="1" height="1" alt="">]]></content:encoded>
        </item>
        <item>
            <title><![CDATA[How to Use Kimi K2.5 Free on OpenClaw]]></title>
            <link>https://medium.com/@sequierh/how-to-use-kimi-k2-5-free-on-openclaw-e2ba93f1f896?source=rss-ba46bfc4582e------2</link>
            <guid isPermaLink="false">https://medium.com/p/e2ba93f1f896</guid>
            <category><![CDATA[ai]]></category>
            <category><![CDATA[nvidia]]></category>
            <category><![CDATA[tutorial]]></category>
            <category><![CDATA[ai-agent]]></category>
            <category><![CDATA[openclaw]]></category>
            <dc:creator><![CDATA[Hugo Sequier]]></dc:creator>
            <pubDate>Fri, 20 Feb 2026 12:12:40 GMT</pubDate>
            <atom:updated>2026-02-20T12:13:42.141Z</atom:updated>
            <content:encoded><![CDATA[<h4>NVIDIA NIM gives you Kimi K2.5 for free. Here’s how to set it up, and what they don’t tell you about latency</h4><figure><img alt="" src="https://cdn-images-1.medium.com/max/1024/1*PManTeu1jYGbTAwaxDuPTQ.png" /><figcaption>Kimi-k2.5 model card on <a href="https://build.nvidia.com/moonshotai/kimi-k2.5/modelcard">https://build.nvidia.com/moonshotai/kimi-k2.5/modelcard</a></figcaption></figure><p>Moonshot AI’s Kimi K2.5 is an impressive open-source model, 1 trillion parameters (32B activated via MoE), 200K context window, native multimodal support, and strong coding performance that rivals paid alternatives. NVIDIA offers free access to it through their NIM platform.</p><p>Here’s how to set it up on OpenClaw in under 5 minutes. Zero cost.</p><h3>What You Need</h3><ul><li><strong>OpenClaw </strong>installed and running (if you’re using a Contago VPS, it’s already pre-configured, literally nothing to set up)</li><li>A free <strong>NVIDIA account</strong></li></ul><p>That’s it.</p><h3>Step 1: Get Your NVIDIA API Key</h3><ol><li>Go to <a href="https://build.nvidia.com/settings/api-keys">NVIDIA API Keys</a></li><li>Create an account or sign in</li><li>Generate an API key, it starts with<em> “nvapi-…”</em></li><li>Copy it somewhere safe</li></ol><figure><img alt="" src="https://cdn-images-1.medium.com/max/893/1*M-eRkjsyELakRbNMq5kd7g.png" /><figcaption>Generate API Key interface</figcaption></figure><h3>Step 2: Set the Environment Variable</h3><p>The API key needs to be available as an environment variable for the OpenClaw service.</p><h4>For your shell (manual usage)</h4><pre>echo &#39;export NVIDIA_API_KEY=&quot;nvapi-YOUR-KEY-HERE&quot;&#39; &gt;&gt; ~/.bashrc<br>source ~/.bashrc</pre><h4>For the systemd service (important!)</h4><p>The systemd service does <strong>not </strong>read “<em>~/.bashrc”</em>. You need to set the variable separately:</p><pre># Immediate (current session)<br>systemctl --user set-environment NVIDIA_API_KEY=&quot;nvapi-YOUR-KEY-HERE&quot;<br><br># Persistent (survives reboots)<br>mkdir -p ~/.config/environment.d<br>echo &#39;NVIDIA_API_KEY=nvapi-YOUR-KEY-HERE&#39; &gt;&gt; ~/.config/environment.d/openclaw.conf</pre><h3>Step 3: Configure openclaw.json</h3><p>Open your config file:</p><pre>nano ~/.openclaw/openclaw.json</pre><h4>Add the NVIDIA NIM provider</h4><p>In the <strong>”models” </strong>section, add:</p><pre>&quot;models&quot;: {<br>  &quot;mode&quot;: &quot;merge&quot;,<br>  &quot;providers&quot;: {<br>    &quot;nvidia-nim&quot;: {<br>      &quot;baseUrl&quot;: &quot;https://integrate.api.nvidia.com/v1&quot;,<br>      &quot;apiKey&quot;: &quot;${NVIDIA_API_KEY}&quot;,<br>      &quot;api&quot;: &quot;openai-completions&quot;,<br>      &quot;models&quot;: [<br>        {<br>          &quot;id&quot;: &quot;moonshotai/kimi-k2.5&quot;,<br>          &quot;name&quot;: &quot;Kimi K2.5 (NVIDIA NIM)&quot;,<br>          &quot;reasoning&quot;: false,<br>          &quot;input&quot;: [&quot;text&quot;],<br>          &quot;cost&quot;: {<br>            &quot;input&quot;: 0,<br>            &quot;output&quot;: 0,<br>            &quot;cacheRead&quot;: 0,<br>            &quot;cacheWrite&quot;: 0<br>          },<br>          &quot;contextWindow&quot;: 200000,<br>          &quot;maxTokens&quot;: 8192<br>        }<br>      ]<br>    }<br>  }<br>}</pre><p>Key things to note:</p><ul><li><strong><em>”mode”: “merge”</em></strong> is <strong>mandatory </strong>for custom providers to work</li><li><strong><em>”apiKey”: “${NVIDIA_API_KEY}”</em></strong> references the env variable , don’t hardcode your key</li><li>The model ID is <em>moonshotai/kimi-k2.5</em> (no <em>nvidia/ </em>prefix)</li></ul><h4><strong>Set it as default with an alias</strong></h4><p>In the <strong><em>”agents” </em></strong>section:</p><pre>&quot;agents&quot;: {<br>  &quot;defaults&quot;: {<br>    &quot;model&quot;: {<br>      &quot;primary&quot;: &quot;kimi&quot;,<br>      &quot;fallbacks&quot;: [<br>        &quot;openrouter/minimax/minimax-m2.5&quot;,<br>        &quot;openrouter/moonshotai/kimi-k2.5&quot;<br>      ]<br>    },<br>    &quot;models&quot;: {<br>      &quot;nvidia-nim/moonshotai/kimi-k2.5&quot;: {<br>        &quot;alias&quot;: &quot;kimi&quot;<br>      }<br>    }<br>  }<br>}</pre><p>The alias <strong><em>”kimi”</em></strong> lets you write <strong><em>”primary”: “kimi”</em></strong> instead of the full provider path.</p><p>The <strong>fallbacks</strong> matter: when NVIDIA rate-limits you (40 RPM), OpenClaw automatically switches to OpenRouter. No manual intervention needed.</p><h3>Step 4: Restart OpenClaw</h3><pre>systemctl --user restart openclaw-gateway</pre><h3>Step 5: Verify</h3><pre>openclaw status</pre><p>You should see something like:</p><pre>| agent:main:main | direct | 1m ago | moonshotai/kimi-k2.5 | unknown/200k (?%) |</pre><p>Quick test:</p><pre>openclaw agent --agent main --session-id test-kimi -m &quot;Say hello and tell me which model you are&quot;</pre><p>If an agent shows “<em>minimax/minimax-m2.5”</em> instead, it means the NVIDIA rate limit was hit and the fallback kicked in. That’s expected behavior.</p><h3>Full Configuration Example</h3><p>Here’s a minimal working <strong><em>openclaw.json</em></strong>:</p><pre>{<br>  &quot;models&quot;: {<br>    &quot;mode&quot;: &quot;merge&quot;,<br>    &quot;providers&quot;: {<br>      &quot;nvidia-nim&quot;: {<br>        &quot;baseUrl&quot;: &quot;https://integrate.api.nvidia.com/v1&quot;,<br>        &quot;apiKey&quot;: &quot;${NVIDIA_API_KEY}&quot;,<br>        &quot;api&quot;: &quot;openai-completions&quot;,<br>        &quot;models&quot;: [<br>          {<br>            &quot;id&quot;: &quot;moonshotai/kimi-k2.5&quot;,<br>            &quot;name&quot;: &quot;Kimi K2.5 (NVIDIA NIM)&quot;,<br>            &quot;reasoning&quot;: false,<br>            &quot;input&quot;: [&quot;text&quot;],<br>            &quot;cost&quot;: {<br>              &quot;input&quot;: 0,<br>              &quot;output&quot;: 0,<br>              &quot;cacheRead&quot;: 0,<br>              &quot;cacheWrite&quot;: 0<br>            },<br>            &quot;contextWindow&quot;: 200000,<br>            &quot;maxTokens&quot;: 8192<br>          }<br>        ]<br>      }<br>    }<br>  },<br>  &quot;agents&quot;: {<br>    &quot;defaults&quot;: {<br>      &quot;model&quot;: {<br>        &quot;primary&quot;: &quot;kimi&quot;,<br>        &quot;fallbacks&quot;: [<br>          &quot;openrouter/minimax/minimax-m2.5&quot;<br>        ]<br>      },<br>      &quot;models&quot;: {<br>        &quot;nvidia-nim/moonshotai/kimi-k2.5&quot;: {<br>          &quot;alias&quot;: &quot;kimi&quot;<br>        }<br>      },<br>      &quot;maxConcurrent&quot;: 4,<br>      &quot;subagents&quot;: {<br>        &quot;maxConcurrent&quot;: 8<br>      }<br>    }<br>  },<br>  &quot;commands&quot;: {<br>    &quot;native&quot;: &quot;auto&quot;,<br>    &quot;nativeSkills&quot;: &quot;auto&quot;<br>  },<br>  &quot;gateway&quot;: {<br>    &quot;mode&quot;: &quot;local&quot;,<br>    &quot;auth&quot;: {<br>      &quot;mode&quot;: &quot;token&quot;,<br>      &quot;token&quot;: &quot;YOUR-GATEWAY-TOKEN&quot;<br>    }<br>  }<br>}</pre><h3>Troubleshooting</h3><h4>Missing env var “NVIDIA_API_KEY”</h4><p>The systemd service can’t see the variable. Fix:</p><pre>systemctl --user set-environment NVIDIA_API_KEY=&quot;nvapi-YOUR-KEY&quot;<br>systemctl --user restart openclaw-gateway</pre><h4>Agent is slow (&gt;30s to respond)</h4><p>That’s the free tier. NVIDIA NIM can be sluggish. If it’s too painful, swap the priority, put OpenRouter as primary and keep NVIDIA as fallback:</p><pre>&quot;model&quot;: {<br>  &quot;primary&quot;: &quot;openrouter/minimax/minimax-m2.5&quot;,<br>  &quot;fallbacks&quot;: [&quot;kimi&quot;]<br>}</pre><h4>Rate limit (40 RPM)</h4><p>If you’re running multiple agents in parallel, you’ll hit the NVIDIA rate limit fast. The fallbacks handle it automatically. Nothing to do.</p><h4>An agent uses a different model</h4><p>If an agent has its own “<em>model.primary”</em> override in the “<em>list” </em>section, it won’t use the default. Remove per-agent model overrides to inherit the global config.</p><h3>The Honest Take</h3><p>Setting this up takes about 3 minutes. Kimi K2.5 is genuinely capable, 256K context, strong at code generation, and the price is unbeatable (free).</p><p><strong>But here’s the catch:</strong> the NVIDIA NIM free tier is <strong>slow</strong>. We’re talking 30+ seconds per response sometimes. For quick experiments or light usage, it’s great. For anything intensive , multi-agent workflows, iterative coding sessions, the latency kills your productivity.</p><p>I personally switched back to OpenRouter after a day. The speed difference is night and day. But I still keep NVIDIA NIM configured as a fallback, free tokens are free tokens.</p><p><strong>TL;DR:</strong> Set it up, enjoy the free access, but don’t expect production-grade speed on the free tier. Use OpenRouter when you need to move fast.</p><img src="https://medium.com/_/stat?event=post.clientViewed&referrerSource=full_rss&postId=e2ba93f1f896" width="1" height="1" alt="">]]></content:encoded>
        </item>
    </channel>
</rss>