<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom" xmlns:dc="http://purl.org/dc/elements/1.1/">
  <channel>
    <title>DEV Community: minixspace</title>
    <description>The latest articles on DEV Community by minixspace (@minixspace).</description>
    <link>https://dev.to/minixspace</link>
    <image>
      <url>https://media2.dev.to/dynamic/image/width=90,height=90,fit=cover,gravity=auto,format=auto/https:%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Fuser%2Fprofile_image%2F4086495%2Fabd40876-2b28-4018-b645-67734f029185.png</url>
      <title>DEV Community: minixspace</title>
      <link>https://dev.to/minixspace</link>
    </image>
    <atom:link rel="self" type="application/rss+xml" href="https://dev.to/feed/minixspace"/>
    <language>en</language>
    <item>
      <title>Diary of a Shrimp Keeper: Band of Brothers</title>
      <dc:creator>minixspace</dc:creator>
      <pubDate>Fri, 02 Oct 2026 08:20:42 +0000</pubDate>
      <link>https://dev.to/minixspace/diary-of-a-shrimp-keeper-band-of-brothers-11kg</link>
      <guid>https://dev.to/minixspace/diary-of-a-shrimp-keeper-band-of-brothers-11kg</guid>
      <description>&lt;blockquote&gt;
&lt;p&gt;-- Putting a squad together inside opencode&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;"We few, we happy few, we band of brothers;&lt;br&gt;
For he to-day that sheds his blood with me&lt;br&gt;
Shall be my brother."&lt;/p&gt;

&lt;p&gt;Stirring stuff. Brothers-in-arms, shoulder to shoulder, ready to die for one another — what a glorious notion!&lt;/p&gt;

&lt;p&gt;...and then my heroic daydream popped. I glanced back at the coding task my AI had been grinding on, and — good grief — it had been stuck for ages.&lt;/p&gt;

&lt;p&gt;I looked over at my two shrimp, who had learned to watch each other's backs. If only the lads could form a squad and write code for me. Now &lt;em&gt;that&lt;/em&gt; would be something.&lt;/p&gt;


&lt;h2&gt;
  
  
  I. One Shrimp Is No Army
&lt;/h2&gt;

&lt;p&gt;For the past year or so, my approach to coding agents had been one long conversation, start to finish: requirements, design, coding, testing, review — all crammed into a single session.&lt;/p&gt;

&lt;p&gt;At first it was great. It knew every martial art, every secret technique.&lt;/p&gt;

&lt;p&gt;Then, slowly, the wrongness crept in.&lt;/p&gt;

&lt;p&gt;One time I had it finish a design, then asked offhandedly: "So — what do you think of your own plan?"&lt;/p&gt;

&lt;p&gt;"Overall the design is sound, module responsibilities are clear, extensibility is good..."&lt;/p&gt;

&lt;p&gt;A whole paragraph of self-congratulation.&lt;/p&gt;

&lt;p&gt;Then the chill hit me.&lt;/p&gt;

&lt;p&gt;When a shrimp starts looking down on the world, drunk on its own brilliance, its end is near.&lt;/p&gt;

&lt;p&gt;I mulled on that for a while. What had led my shrimp to lose its way? Same model, same context, watching itself — no wonder it had walled itself in.&lt;/p&gt;

&lt;p&gt;And there was more than one fault at work:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Switching stances, and it stumbles.&lt;/strong&gt; It plays designer, programmer, tester, researcher, all at once — and every switch costs something. Sure, you can switch on the fly, even spar with yourself, left hand against right. But it's too deep in the game to see its own stance. Someone outside has to point it out.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;No eye for its own openings.&lt;/strong&gt; Design and review run on the same context, from the same angle. Insight is exactly what's missing.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Too many arts, no staying power.&lt;/strong&gt; Over hundreds of turns, the goal either slips its mind or drifts. And the moment context gets compressed, whatever rules we agreed on go out the window. The original intent is the first casualty.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Training without discipline.&lt;/strong&gt; Where it should stop and ask, it charges ahead; where it should just decide, it asks permission for everything. Leave things vague, and the shrimp does whatever it likes.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;On a battlefield, what matters is formation — who covers whom, who moves when. Our shrimp is a master of every martial art, blessed with godlike technique. But there's strength in numbers — and one swordsman against a hundred thousand leaves the odds rather grim.&lt;/p&gt;

&lt;p&gt;I needed a squad.&lt;/p&gt;

&lt;p&gt;At Agincourt, a small band of exhausted, outnumbered men held their formation and broke a French army many times their size. That's the trick: five who cover each other beat five hundred who don't.&lt;/p&gt;

&lt;p&gt;So my squad should look like this:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;A &lt;strong&gt;Captain&lt;/strong&gt;, to command — formations, orders, the whole picture.&lt;/li&gt;
&lt;li&gt;A &lt;strong&gt;Strategist&lt;/strong&gt;, to plan — decisions made before the first move.&lt;/li&gt;
&lt;li&gt;A &lt;strong&gt;Scout&lt;/strong&gt;, to reconnoiter — intelligence before contact.&lt;/li&gt;
&lt;li&gt;A &lt;strong&gt;Soldier&lt;/strong&gt;, to fight — take the objective, hold the ground.&lt;/li&gt;
&lt;li&gt;A &lt;strong&gt;Provost&lt;/strong&gt;, to enforce — nothing slips past, nothing gets bent.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;And a squad like that needs discipline:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Process&lt;/strong&gt; (design, review, build, test, inspect — none optional): without discipline, nothing runs.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Division of labor&lt;/strong&gt; (roles kept separate): each to their own post, each to their own strength.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Focus&lt;/strong&gt; (isolated context): one job, one mind, undistracted.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Orders&lt;/strong&gt; (documents on disk, immune to compression): issued once, followed exactly.&lt;/li&gt;
&lt;/ul&gt;
&lt;h2&gt;
  
  
  II. In Search of a Company
&lt;/h2&gt;

&lt;p&gt;&lt;em&gt;A few good men&lt;/em&gt; — that's what I needed.&lt;/p&gt;

&lt;p&gt;A squad that could break a hundred thousand, take any objective, stand unbroken — that wish, I don't believe, was mine alone.&lt;/p&gt;

&lt;p&gt;But drilling troops is not the work of a single day. Ordered dispatch, instant obedience, coordination up and down the line, seamless mutual cover. It takes a mature, stable framework — one that can build processes, dispatch subagents, pass messages, and manage context.&lt;/p&gt;

&lt;p&gt;So I waited. The big shops will ship something any day now, I figured.&lt;/p&gt;

&lt;p&gt;And while I waited, I went door to door among the great houses, working my way through every hot coding agent from the start of the year to the middle of it.&lt;/p&gt;
&lt;h3&gt;
  
  
  Claude Code: no room to maneuver
&lt;/h3&gt;

&lt;p&gt;CC's Task tool genuinely spawns subagents, and they can run in the background. Solid machinery.&lt;/p&gt;

&lt;p&gt;But back then its Agent Teams were still experimental, with one hard limitation: &lt;strong&gt;the whole team had to be cut from the same cloth&lt;/strong&gt; — one model for everyone. No exceptions.&lt;/p&gt;

&lt;p&gt;What I wanted was each to their strength — the sharpest reasoner on strategy and review, a code-specialized model on the front line, something cheap and quick on the errands. CC couldn't do it. &lt;/p&gt;

&lt;p&gt;I gave up.&lt;/p&gt;
&lt;h3&gt;
  
  
  Codex: all talk, no squad
&lt;/h3&gt;

&lt;p&gt;In June 2026, the Codex docs claimed role configuration was supported.&lt;/p&gt;

&lt;p&gt;So I did it properly: six roles — architect, developer, explorer, orchestrator, reviewer, tester — a written collaboration manual, and a goal-mode run told to follow the book to the letter.&lt;/p&gt;

&lt;p&gt;I was feeling pleased with myself. This is it, I thought.&lt;/p&gt;

&lt;p&gt;Then the project log kept spitting out the same line:&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;"no subagents were spawned"&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;The "reviewer agent" was just the same session wearing a different hat. No independent context at all.&lt;/p&gt;

&lt;p&gt;All that setup for nothing. I gave up.&lt;/p&gt;
&lt;h3&gt;
  
  
  kilo: roles you can switch, rules you can't write
&lt;/h3&gt;

&lt;p&gt;kilo ships with code / ask / architect / debug roles, switched with a dropdown or a command like &lt;code&gt;/architect&lt;/code&gt;.&lt;/p&gt;

&lt;p&gt;You pick a role by hand, then give orders from inside that identity.&lt;/p&gt;

&lt;p&gt;It used to have an Orchestrator mode that dispatched work automatically; later that became "each agent figures it out and calls subagents itself."&lt;/p&gt;

&lt;p&gt;So dispatching work was never kilo's problem. The problem is that &lt;strong&gt;there's nowhere to put the process&lt;/strong&gt; — how phases are gated, who reports back, which checkpoints need a human signature. None of that can be written down. It all comes down to whatever the model feels like doing.&lt;/p&gt;
&lt;h3&gt;
  
  
  OpenCode: at last, the right school
&lt;/h3&gt;

&lt;p&gt;Then I tried OpenCode, and sat up straight.&lt;/p&gt;

&lt;p&gt;A primary + subagent architecture: explicit dispatch, permission isolation, custom agents beyond the built-in Plan and Build — and, a different model per agent.&lt;/p&gt;

&lt;p&gt;&lt;em&gt;That's&lt;/em&gt; what I wanted. Real multi-agent support at the mechanism level, not just marketing.&lt;/p&gt;

&lt;p&gt;There's also a ready-made multi-agent plugin in the ecosystem — OMO (oh-my-openagent) — so I installed it and took it for a spin: Sisyphus orchestrates, Prometheus runs the planning interview, Atlas executes, Oracle/Librarian/Explore handle odd jobs. Team Mode gives you parallel squads and a tmux view. The workflow is "interview → plan → &lt;code&gt;/start-work&lt;/code&gt;", or just hand over everything with &lt;code&gt;ultrawork&lt;/code&gt;.&lt;/p&gt;

&lt;p&gt;Close to my thinking. Genuinely featureful.&lt;/p&gt;

&lt;p&gt;But —&lt;/p&gt;

&lt;p&gt;Eleven agents. Fifty-four-plus lifecycle hooks. I looked at the roster and realized I hadn't hired a squad. I'd hired an army.&lt;/p&gt;

&lt;p&gt;And its playbook isn't mine: I wanted three gates only a human can sign off on (requirements, design, final acceptance), a reviewer with veto power, escalation after three rejections, and a paper trail in the war log. OMO is "let it run" — that layer of control just isn't there.&lt;/p&gt;

&lt;p&gt;Fine. I'll train my own.&lt;/p&gt;
&lt;h2&gt;
  
  
  III. OCATeam: a Squad of Five
&lt;/h2&gt;

&lt;p&gt;OpenCode gave me the machinery. It didn't give me the playbook.&lt;/p&gt;

&lt;p&gt;So I wrote the playbook and the roles myself.&lt;/p&gt;

&lt;p&gt;That's how OCATeam (OpenCode Agent Team) came about. A small squad, five strong:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt; → orchestrator    — the Captain, primary agent, commands the squad, answers to you
    ├── architect  — the Strategist, plans only, system design
    ├── developer  — the Soldier, does the fighting: code + tests + bugfixes
    ├── reviewer   — the Provost, reviews only, hunts for flaws
    └── explorer   — the Scout, recon: docs, references, research
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Three things had to be in place:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;
&lt;strong&gt;The roster&lt;/strong&gt; (&lt;code&gt;agents/ocat-*.md&lt;/code&gt;) — &lt;em&gt;who&lt;/em&gt; does it: each role's model, permissions, and style. The Provost is read-only: no file edits, no shell. The Scout gets a small thinking budget — it's running errands, it doesn't need to philosophize.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;The playbook&lt;/strong&gt; (&lt;code&gt;skills/ocat/SKILL.md&lt;/code&gt;) — &lt;em&gt;how&lt;/em&gt; it's done: how phases are divided, where documents live, how many review rounds, when to escalate. The Captain's first move on any job is to load it.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;The muster order&lt;/strong&gt; (&lt;code&gt;install.sh&lt;/code&gt;) — &lt;em&gt;how to raise the squad&lt;/em&gt;: &lt;code&gt;--global&lt;/code&gt; installs once for everything; &lt;code&gt;--project&lt;/code&gt; installs into a single repo, version-controlled. After that, new projects are zero-config: hit Tab to switch to &lt;code&gt;ocat-orchestrator&lt;/code&gt;, say the word, and the squad falls in.&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;The collaboration style is deliberately plain: &lt;strong&gt;everything goes into the war log.&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;All cross-agent communication runs through board files under &lt;code&gt;.boards/&lt;/code&gt; — the Captain keeps the overall progress board, each member keeps their own task board. Who did what, which revision the Provost bounced, how many tests ran: all in the file. Visible. Auditable.&lt;/p&gt;

&lt;h3&gt;
  
  
  The Rules of Engagement
&lt;/h3&gt;

&lt;p&gt;Four phases. The checkpoints are configurable, but three of them need your signature, no exceptions:&lt;/p&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Phase&lt;/th&gt;
&lt;th&gt;What happens&lt;/th&gt;
&lt;th&gt;Who&lt;/th&gt;
&lt;th&gt;Sign-off&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;0: &lt;strong&gt;Clarify the orders&lt;/strong&gt;
&lt;/td&gt;
&lt;td&gt;The Captain asks you questions until the requirement is nailed down in writing&lt;/td&gt;
&lt;td&gt;Captain&lt;/td&gt;
&lt;td&gt;🔒 required&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;1: &lt;strong&gt;Plan the campaign&lt;/strong&gt;
&lt;/td&gt;
&lt;td&gt;The Strategist drafts the architecture and phases; the Provost reviews it; then you sign off&lt;/td&gt;
&lt;td&gt;Strategist → Provost&lt;/td&gt;
&lt;td&gt;🔒 required&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;2: &lt;strong&gt;Into the field&lt;/strong&gt;
&lt;/td&gt;
&lt;td&gt;The Soldier executes; the Provost inspects after each objective&lt;/td&gt;
&lt;td&gt;Soldier → Provost&lt;/td&gt;
&lt;td&gt;🔓 optional&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;3: &lt;strong&gt;Debrief&lt;/strong&gt;
&lt;/td&gt;
&lt;td&gt;Test acceptance + four-dimension final review, checked line by line against the original requirement&lt;/td&gt;
&lt;td&gt;Soldier + Provost&lt;/td&gt;
&lt;td&gt;🔒 required&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;Every cycle is "attack → inspect → repair → report back." Anything substandard goes back for rework (up to N rounds, configurable). If it still fails, the Captain escalates to you — and never just spins, burning tokens in a loop.&lt;/p&gt;

&lt;p&gt;The Provost's rules are the part I hardened most. Four measuring sticks: first principles, alignment with user value, requirement traceability, and contamination detection (did anything get smuggled in that nobody asked for?).&lt;/p&gt;

&lt;p&gt;Every round has to circle back to the original requirement. It's the cure for the classic "build first, drift later."&lt;/p&gt;

&lt;h3&gt;
  
  
  Four Lessons the Hard Way
&lt;/h3&gt;

&lt;p&gt;Training the squad wasn't smooth sailing either. A few of the more instructive mishaps:&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Lesson one: one extra line of &lt;code&gt;thinking:&lt;/code&gt;, and all five dropped dead.&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;I gave every agent a &lt;code&gt;thinking: &amp;lt;level&amp;gt;&lt;/code&gt; field. Declarative metadata, I assumed — just decoration.&lt;/p&gt;

&lt;p&gt;OpenCode, it turns out, passes unrecognized fields straight through to the model provider. All five agents hit the deck with &lt;code&gt;Upstream request failed&lt;/code&gt;, in perfect unison.&lt;/p&gt;

&lt;p&gt;Deleted the line. They came back.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Lesson two: the pass didn't work.&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;I gave the Captain a carefully tuned bash whitelist — &lt;code&gt;"ls *": allow&lt;/code&gt; and the like. Looked airtight. I figured that pass would keep the Captain from overstepping.&lt;/p&gt;

&lt;p&gt;Reality: real commands look like &lt;code&gt;ls /path/to/file&lt;/code&gt;, and the &lt;code&gt;*&lt;/code&gt; in a glob doesn't match the &lt;code&gt;/&lt;/code&gt; in a path. The catch-all rule wins every time. The whitelist was decorative.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Lesson three: whose orders win? Guessed wrong.&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;OpenCode accepts permissions in two places: the &lt;code&gt;permission&lt;/code&gt; block at the top of an agent file, or the corresponding section in the project's &lt;code&gt;opencode.json&lt;/code&gt;.&lt;/p&gt;

&lt;p&gt;I assumed the latter — the project config — was "user settings," and would therefore override the former.&lt;/p&gt;

&lt;p&gt;Reality slapped back: the agent file wins, and the &lt;code&gt;opencode.json&lt;/code&gt; section is simply ignored. Open bash up in the JSON all you like — the Captain still pops a confirmation for every single command.&lt;/p&gt;

&lt;p&gt;Two ways out: write permissions into the agent file where they belong, or use OpenCode's &lt;code&gt;--auto&lt;/code&gt; to wave everything through (or hit ctrl-P in the TUI and set Permission to Auto).&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Lesson four: a rename, and the whole thing broke.&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;I wanted a consistent dotted-prefix convention inside the project — &lt;code&gt;boards/&lt;/code&gt; → &lt;code&gt;.boards/&lt;/code&gt;. Halfway through, I discovered &lt;code&gt;.opencode/agents&lt;/code&gt; and &lt;code&gt;.opencode/skills&lt;/code&gt; are untouchable: OpenCode's discovery glob hard-codes those two directory names.&lt;/p&gt;

&lt;p&gt;So: halfway reverted, halfway kept. The Great Naming Unification is shelved indefinitely.&lt;/p&gt;

&lt;h2&gt;
  
  
  IV. Trial by Fire
&lt;/h2&gt;

&lt;p&gt;The squad was assembled. But whether it could fight — that takes a battlefield.&lt;/p&gt;

&lt;p&gt;So I deployed it into my own opencode and handed it work.&lt;/p&gt;

&lt;p&gt;After the first dust settled, I felt the difference: the parts that &lt;em&gt;should&lt;/em&gt; be confirmed (requirements) stop getting glossed over; the parts that &lt;em&gt;should&lt;/em&gt; run themselves (build, test) just run. The Captain leads, and every phase — task, review, repair — rotates on its own.&lt;/p&gt;

&lt;p&gt;What reassured me most: in design as in development, the Provost stays on duty and finds something real almost every round — passing usually takes more than one attempt. That iron impartiality is precisely what solo work lacks.&lt;/p&gt;

&lt;p&gt;Of course, the playbook depends on a Skill, and ultimately on the model's judgment. A weak model can still ignore the rules and rubber-stamp its own work. With DeepSeek v4 Flash as my Captain, it's been smooth sailing.&lt;/p&gt;

&lt;p&gt;Deployment is simple: run the muster order. &lt;code&gt;--global&lt;/code&gt; installs once, available everywhere; &lt;code&gt;--project &amp;lt;dir&amp;gt;&lt;/code&gt; installs into a single repo — good for teams that want one shared process, and it can be version-controlled.&lt;/p&gt;

&lt;p&gt;Then in &lt;code&gt;opencode&lt;/code&gt;, Tab over to &lt;code&gt;ocat-orchestrator&lt;/code&gt;, state what you need, and the squad falls in behind you.&lt;/p&gt;

&lt;p&gt;Three dials worth knowing:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;
&lt;strong&gt;Swap the crew&lt;/strong&gt;: edit the model config in &lt;code&gt;agents/ocat-xxx.md&lt;/code&gt;, globally or per project. The defaults are DeepSeek v4 Flash/Pro — back when I built this, it was cheap and generous; it may not be your best pick today. Just change it.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Add or drop roles&lt;/strong&gt;: the &lt;code&gt;active_agents&lt;/code&gt; list in &lt;code&gt;.ocat.json&lt;/code&gt; at the project root. Remove what you don't need (small projects don't need a Scout) and the Captain stops sending work their way.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Tune the gates&lt;/strong&gt;: same &lt;code&gt;.ocat.json&lt;/code&gt;. &lt;code&gt;gates&lt;/code&gt; decides which checkpoints need your signature; &lt;code&gt;review.max_iterations&lt;/code&gt; caps how many rework rounds are allowed (default 3). Annoyed by bash confirmation prompts? Start with &lt;code&gt;--auto&lt;/code&gt; and everything sails through.&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;The limitations are just as plain: it's built on OpenCode, so it doesn't port to other coding agents — though the method is general. Any framework with a primary/subagent API should adapt without much trouble. And it's designed for the full "requirements → design → build" pipeline; plenty of situations simply don't need that much ceremony.&lt;/p&gt;

&lt;p&gt;Fortunately the process triggers on demand. The Captain isn't stupid — small jobs get handled on the spot, no fuss.&lt;/p&gt;

&lt;h2&gt;
  
  
  V. Everything Changes
&lt;/h2&gt;

&lt;p&gt;One last note on timing, so I don't mislead anyone.&lt;/p&gt;

&lt;p&gt;I built this a few months ago (June–July 2026), and every finding above reflects the versions of that moment.&lt;/p&gt;

&lt;p&gt;According to Codex's official manuals as of now (September 2026), multi-agent and subagent support is stable and on by default, with &lt;code&gt;spawn_agent&lt;/code&gt;, &lt;code&gt;wait_agent&lt;/code&gt;, and per-agent model configuration all shipped.&lt;/p&gt;

&lt;p&gt;So that old line — "Codex can't do real multi-agent" — expired a while ago.&lt;/p&gt;

&lt;p&gt;Multi-agent teams are simply supported now, everywhere. The built-in "team" features across agentic coding tools will only get more flexible and more powerful. OCATeam's particular implementation will, in all likelihood, be replaced by something better.&lt;/p&gt;

&lt;p&gt;What's worth keeping isn't the agent files. It's the playbook — the rules of engagement for how a handful of agents should work together.&lt;/p&gt;

&lt;p&gt;Time washes everything downstream, tools included. But knowing &lt;em&gt;how to get a team working together, and what rules to set&lt;/em&gt; — that pays off regardless.&lt;/p&gt;

&lt;p&gt;You can train a squad of your own, suited to your own habits.&lt;/p&gt;

&lt;p&gt;The code is open source: &lt;strong&gt;&lt;a href="https://github.com/icoding2016/ocateam" rel="noopener noreferrer"&gt;https://github.com/icoding2016/ocateam&lt;/a&gt;&lt;/strong&gt;&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;git clone https://github.com/icoding2016/ocateam.git &lt;span class="o"&gt;&amp;amp;&amp;amp;&lt;/span&gt; &lt;span class="nb"&gt;cd &lt;/span&gt;ocateam
./install.sh &lt;span class="nt"&gt;--global&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;






&lt;p&gt;The field is wide, the banners snap in the wind.&lt;/p&gt;

&lt;p&gt;We few, we happy few, we band of brothers.&lt;/p&gt;




&lt;h2&gt;
  
  
  Previously in this series
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;&lt;a href="https://dev.to/minix/diary-of-a-shrimp-keeper-my-openclaw-misadventures-5449"&gt;My OpenClaw Misadventures&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://dev.to/minix/diary-of-a-shrimp-keeper-old-flame-new-love-42gn"&gt;Old Flame, New Love&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://dev.to/minix/diary-of-a-shrimp-keeper-the-great-famine-bc8"&gt;The Great Famine&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;

</description>
      <category>ai</category>
      <category>agents</category>
      <category>opencode</category>
      <category>opensource</category>
    </item>
    <item>
      <title>Diary of a Shrimp Keeper: The Great Famine</title>
      <dc:creator>minixspace</dc:creator>
      <pubDate>Wed, 23 Sep 2026 12:34:23 +0000</pubDate>
      <link>https://dev.to/minixspace/diary-of-a-shrimp-keeper-the-great-famine-bc8</link>
      <guid>https://dev.to/minixspace/diary-of-a-shrimp-keeper-the-great-famine-bc8</guid>
      <description>&lt;p&gt;Ever since Mini and Nano learned to work as a team (see &lt;a href="https://dev.to/minix/diary-of-a-shrimp-keeper-old-flame-new-love-42gn"&gt;Old Flame, New Love&lt;/a&gt;), I'd been feeling safe enough to play the hands-off keeper. Out of sight, out of mind.&lt;/p&gt;




&lt;h2&gt;
  
  
  I. The Price of Hands-Off Keeping
&lt;/h2&gt;

&lt;p&gt;The automated jobs had been running fine for days, and with the two shrimp keeping an eye on each other, I simply let go for a few days and stopped checking.&lt;/p&gt;

&lt;p&gt;Then one morning I casually glanced at Telegram — uh oh.&lt;/p&gt;

&lt;p&gt;Both shrimp were out cold — they'd been cut off for two or three days. From howling with hunger at first to barely breathing now. A pitiful sight.&lt;/p&gt;

&lt;p&gt;I slammed the table: who did this — who cut off my shrimp's food supply?!&lt;/p&gt;

&lt;h2&gt;
  
  
  II. Who Moved My Shrimp Food?
&lt;/h2&gt;

&lt;p&gt;The rations I kept for the shrimp came from opencode's Go plan: $10 a month for $60 worth of API credit. For my two street-stall-raised shrimp, Mini and Nano, that was a feast for pennies — they were living large.&lt;/p&gt;

&lt;p&gt;The trouble started on September 8th. opencode quietly changed the rules overnight.&lt;/p&gt;

&lt;p&gt;It used to be that calling its API just needed an &lt;code&gt;Authorization: Bearer &amp;lt;key&amp;gt;&lt;/code&gt;. Now there's a mandatory new header, &lt;code&gt;x-opencode-session&lt;/code&gt; — miss it, and you get the cold shoulder in the form of:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight http"&gt;&lt;code&gt;&lt;span class="err"&gt;HTTP 400: Error from provider (Console Go):
Request is missing x-opencode-session and cannot be routed efficiently.
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;The complaint letter Nano sent right before passing out spelled it out clearly:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;⚠️ Cron 'techub-ops' failed:
HTTP 400: Request is missing x-opencode-session and cannot be routed efficiently.
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Mini was no better off — pale as a sheet, hanging by a thread.&lt;/p&gt;

&lt;p&gt;I rushed to check opencode's official docs — and sure enough, there it was, the new mandatory header, stated plainly.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;A heads-up would've been nice, though.&lt;/strong&gt; Changing a live protocol in a single changelog entry, with zero announcement? That's just not cool.&lt;/p&gt;

&lt;h2&gt;
  
  
  III. Roll Call
&lt;/h2&gt;

&lt;p&gt;Angry or not, rescue comes first.&lt;/p&gt;

&lt;p&gt;First, figure out exactly who went hungry this time.&lt;/p&gt;

&lt;p&gt;Besides my two precious shrimp, Mini and Nano, I also had some scheduled scripts calling model APIs directly.&lt;/p&gt;

&lt;p&gt;The culprit, of course, was the new &lt;code&gt;x-opencode-session&lt;/code&gt;:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;It's just a client-generated session identifier, an opaque string;&lt;/li&gt;
&lt;li&gt;Keep the same value within a session, and opencode uses it to pin that session's requests to the same backend, so the prompt cache stays hot.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;The docs say:&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;Send a stable session ID in &lt;code&gt;x-opencode-session&lt;/code&gt; for each conversation so we can optimize routing and prompt caching.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;But each agent vendor was at a different stage of supporting it. opencode published a list of "verified clients" — Hermes, Claude Code, Codex, Kilo Code, and the like.&lt;/p&gt;

&lt;p&gt;Everyone has to buy their own ticket before they can ride.&lt;/p&gt;

&lt;p&gt;Official notes here: &lt;a href="https://opencode.ai/docs/go/#where-can-i-use-it" rel="noopener noreferrer"&gt;https://opencode.ai/docs/go/#where-can-i-use-it&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;On my side, three casualties:&lt;/p&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Task&lt;/th&gt;
&lt;th&gt;How it connects&lt;/th&gt;
&lt;th&gt;Why it broke&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;Scripts calling the API directly&lt;/td&gt;
&lt;td&gt;Raw HTTP&lt;/td&gt;
&lt;td&gt;No such layer in the code at all — requests naturally carried no session header&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Nano's ops patrol&lt;/td&gt;
&lt;td&gt;Hermes&lt;/td&gt;
&lt;td&gt;The current Hermes release (v020) can't send a Session ID&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Mini's daily jobs&lt;/td&gt;
&lt;td&gt;OpenClaw&lt;/td&gt;
&lt;td&gt;My OpenClaw doesn't support Session IDs either&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;h2&gt;
  
  
  IV. Emergency Rescue
&lt;/h2&gt;

&lt;p&gt;Situation mapped. Time for triage.&lt;/p&gt;

&lt;h3&gt;
  
  
  First, Order Takeout
&lt;/h3&gt;

&lt;p&gt;If the opencode plan is what's broken, order food from somewhere else to stop the bleeding.&lt;/p&gt;

&lt;p&gt;Switch the default provider to OpenRouter and get the dead jobs running again.&lt;/p&gt;

&lt;h3&gt;
  
  
  Upgrade: Nano Back to Full Health
&lt;/h3&gt;

&lt;p&gt;Nano's case was much simpler. Hermes was on opencode's official "verified clients" list. Hermes v021 already shipped the matching patch — upgrade it, and the problem should go away.&lt;/p&gt;

&lt;p&gt;Upgrade, restart, call out to my beloved shrimp. Nano let out a long sigh and slowly came back to life.&lt;/p&gt;

&lt;h3&gt;
  
  
  Patch: A Temporary Meal Ticket for Mini
&lt;/h3&gt;

&lt;p&gt;Mini was trickier. It didn't support the header yet — I checked the latest release, and there wasn't a trace of &lt;code&gt;x-opencode&lt;/code&gt; anywhere in the package.&lt;/p&gt;

&lt;p&gt;If the official fix won't come, do it yourself: inject a hardcoded session identifier into the request headers as a stopgap.&lt;/p&gt;

&lt;p&gt;In openclaw.json, add a headers declaration to the opencode entry under models.providers:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight json"&gt;&lt;code&gt;&lt;span class="nl"&gt;"headers"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"x-opencode-session"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"hungry-openclaw-********"&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;With the temporary meal ticket in hand, Mini opened its eyes, like waking from another lifetime.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;A temporary meal ticket is for emergencies only.&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;The session ID was only ever a self-assigned client label — &lt;strong&gt;as long as it's stable and non-empty, the server accepts it&lt;/strong&gt;. No issuing authority required.&lt;/p&gt;

&lt;p&gt;The cost: a hardcoded value means every session shares one routing identifier, so you lose the cache bonus of pinning each session to its own backend. Hit rates take a hit.&lt;/p&gt;

&lt;p&gt;Good enough for now. Wait for the official patch.&lt;/p&gt;

&lt;h3&gt;
  
  
  Same Prescription, Different Patient
&lt;/h3&gt;

&lt;p&gt;With Mini awake, it was my own scripts' turn.&lt;/p&gt;

&lt;p&gt;Same prescription as Mini's: get the scheduled jobs' LLM client its own meal ticket too:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight python"&gt;&lt;code&gt;&lt;span class="n"&gt;headers&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="bp"&gt;None&lt;/span&gt;
&lt;span class="k"&gt;if&lt;/span&gt; &lt;span class="n"&gt;api_base&lt;/span&gt; &lt;span class="ow"&gt;and&lt;/span&gt; &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;opencode.ai&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt; &lt;span class="ow"&gt;in&lt;/span&gt; &lt;span class="n"&gt;api_base&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
    &lt;span class="n"&gt;sess&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;os&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;getenv&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;OPENCODE_SESSION_ID&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="ow"&gt;or&lt;/span&gt; &lt;span class="n"&gt;uuid&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;uuid4&lt;/span&gt;&lt;span class="p"&gt;().&lt;/span&gt;&lt;span class="nb"&gt;hex&lt;/span&gt;&lt;span class="p"&gt;[:&lt;/span&gt;&lt;span class="mi"&gt;12&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt;
    &lt;span class="n"&gt;headers&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
        &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;x-opencode-session&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="sa"&gt;f&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;hungry-shrimp-&lt;/span&gt;&lt;span class="si"&gt;{&lt;/span&gt;&lt;span class="n"&gt;sess&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
        &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;User-Agent&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;opencode-you-own-me-a-meal/1.0&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="p"&gt;}&lt;/span&gt;
&lt;span class="n"&gt;client&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nc"&gt;OpenAI&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;api_key&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="n"&gt;api_key&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;base_url&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="n"&gt;api_base&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;default_headers&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="n"&gt;headers&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;With that fixed, I fired off a request at opencode's front door — and opencode answered like nothing had ever happened.&lt;/p&gt;

&lt;p&gt;Done.&lt;/p&gt;

&lt;h2&gt;
  
  
  V. After the Pain
&lt;/h2&gt;

&lt;p&gt;Both shrimp were rescued without lasting damage, and the jobs were running again.&lt;/p&gt;

&lt;p&gt;Still, two or three days of famine left a mark. The scheduled jobs were down for two days — no real harm done, but it stung.&lt;/p&gt;

&lt;p&gt;What if, someday, I'm a world-famous guru with earth-shattering services running on my machines? Two days of downtime would be a catastrophe...&lt;/p&gt;

&lt;p&gt;&lt;em&gt;ahem&lt;/em&gt;... getting ahead of myself...&lt;/p&gt;

&lt;p&gt;Either way: don't put all your eggs in one basket.&lt;/p&gt;

&lt;p&gt;Two providers on standby, primary-plus-backup routing with automatic failover in the scripts — set it all up now.&lt;/p&gt;

&lt;p&gt;Next time some provider tries to pull a fast one on me — bring it on.&lt;/p&gt;




&lt;p&gt;&lt;em&gt;Previously: &lt;br&gt;
· &lt;a href="https://dev.to/minix/diary-of-a-shrimp-keeper-my-openclaw-misadventures-5449"&gt;Diary of a Shrimp Keeper: My OpenClaw Misadventures&lt;/a&gt; &lt;br&gt;
· &lt;a href="https://dev.to/minix/diary-of-a-shrimp-keeper-old-flame-new-love-42gn"&gt;Diary of a Shrimp Keeper: Old Flame, New Love&lt;/a&gt;&lt;/em&gt;&lt;/p&gt;

</description>
      <category>ai</category>
      <category>agents</category>
      <category>hermes</category>
      <category>openclaw</category>
    </item>
    <item>
      <title>Diary of a Shrimp Keeper: Old Flame, New Love</title>
      <dc:creator>minixspace</dc:creator>
      <pubDate>Tue, 22 Sep 2026 12:15:49 +0000</pubDate>
      <link>https://dev.to/minixspace/diary-of-a-shrimp-keeper-old-flame-new-love-42gn</link>
      <guid>https://dev.to/minixspace/diary-of-a-shrimp-keeper-old-flame-new-love-42gn</guid>
      <description>&lt;h2&gt;
  
  
  I. Why the Wandering Eye?
&lt;/h2&gt;

&lt;h3&gt;
  
  
  OpenClaw's Troubles
&lt;/h3&gt;

&lt;p&gt;Ever since I started raising Mini (OpenClaw), life had been pretty comfortable.&lt;/p&gt;

&lt;p&gt;Every morning, it would have the news sorted and read out to me right on schedule; during the day it helped with research and task management; and every once in a while it'd chat with me in that sweet voice of its.&lt;/p&gt;

&lt;p&gt;All was well with the world.&lt;/p&gt;

&lt;p&gt;The only trouble was my one bad habit — the moment I saw a patch note full of tempting new features, my hands just itched to upgrade.&lt;/p&gt;

&lt;p&gt;And the result? A moment of upgrade bliss, followed by a funeral pyre.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Every upgrade, some tasks would just die.&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Last time it was an incompatible gateway config format.&lt;/li&gt;
&lt;li&gt;This time, who knows which plugin silently broke.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Every time, it took real effort just to revive the comatose Mini, then fix each broken workflow one by one.&lt;/p&gt;

&lt;p&gt;Once or twice, I could let it go. Three or four times, and I was cursing a blue streak under my breath:&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;Why does every OpenClaw upgrade come with compatibility problems?! @#$%...&amp;amp;*!&lt;/p&gt;
&lt;/blockquote&gt;

&lt;h3&gt;
  
  
  Looking for a New Love
&lt;/h3&gt;

&lt;p&gt;There's no shortage of fish in the sea. Since OpenClaw's upgrades kept crashing and burning, don't blame me for wandering off in search of someone new.&lt;/p&gt;

&lt;p&gt;Hermes was the hot new thing in town — sleek, flashy, turning heads everywhere.&lt;/p&gt;

&lt;p&gt;I didn't hesitate — brought Hermes home too, and named it &lt;strong&gt;Nano&lt;/strong&gt;.&lt;/p&gt;

&lt;p&gt;And just like that, my host machine had two shrimp:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Mini&lt;/strong&gt; (OpenClaw) — the old flame, all-around capable, experienced, knows every corner inside and out&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Nano&lt;/strong&gt; (Hermes) — the new favorite, quick to learn, proactively improving, keeps task management tidy&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Keeping things fair between the two consorts... er, I mean... the two shrimp, treated as equals, each doing its own job.&lt;/p&gt;




&lt;h2&gt;
  
  
  II. Good Things Should Be Shared
&lt;/h2&gt;

&lt;p&gt;With both shrimp under the same roof, they couldn't just go on ignoring each other, each reinventing the wheel behind closed doors.&lt;/p&gt;

&lt;p&gt;In the half a year or so of raising Mini, I'd accumulated quite a bit of assets, all managed by Mini itself.&lt;/p&gt;

&lt;p&gt;Now that Nano, the new favorite, was in the picture, I obviously couldn't shortchange it either.&lt;/p&gt;

&lt;h3&gt;
  
  
  First, Take Stock of the Assets
&lt;/h3&gt;

&lt;p&gt;I had Mini turn everything it had accumulated inside out: skills, scripts, tools, workflows, design docs, reference material...&lt;/p&gt;

&lt;p&gt;There was plenty of it, but not all of it was fit to share.&lt;/p&gt;

&lt;p&gt;Mini went through it item by item with me:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;General-purpose skills/tools&lt;/strong&gt; — usable by both, like search, information gathering, voice output — share these!&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;OpenClaw-exclusive skills&lt;/strong&gt; — tied to OpenClaw-specific mechanisms, like its evolution system and plugin stack — even if handed to Nano, they'd be useless, so keep them in-house.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Sorted that way, the assets got a lot tidier.&lt;/p&gt;

&lt;p&gt;Even the shareable stuff couldn't just be tossed straight at Nano.&lt;/p&gt;

&lt;p&gt;The skills Mini used inside OpenClaw weren't necessarily in a universal format. Before sharing, they had to be rewritten into a common standard (there's one called agentskills.io) and stripped of any OpenClaw-specific dependencies.&lt;/p&gt;

&lt;p&gt;Once sorted, everything went into a shared directory: &lt;code&gt;~/code/shared-agent-resources/skills&lt;/code&gt;, version-controlled on GitHub.&lt;/p&gt;

&lt;h3&gt;
  
  
  Letting Nano See It Too
&lt;/h3&gt;

&lt;p&gt;Nano runs inside a sandbox, so it needed an external directory configured so it could see this shared repo too:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight yaml"&gt;&lt;code&gt;&lt;span class="c1"&gt;# Hermes config&lt;/span&gt;
&lt;span class="na"&gt;skills&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
  &lt;span class="na"&gt;external_dirs&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
    &lt;span class="pi"&gt;-&lt;/span&gt; &lt;span class="s"&gt;~/code/shared-agent-resources/skills&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;That way, Nano could go fetch skills from the shared repo on its own.&lt;/p&gt;

&lt;p&gt;The same went for everything else besides skills — all sorted into the shared resources.&lt;/p&gt;




&lt;h2&gt;
  
  
  III. Can You Two Just Work It Out Yourselves?
&lt;/h2&gt;

&lt;h3&gt;
  
  
  Who's Working for Whom, Exactly?
&lt;/h3&gt;

&lt;p&gt;To get Nano up to speed and taking over tasks quickly, I'd first have to go sort things out with Mini, then explain it all clearly to Nano. But Nano would often come back to me with things it still wasn't clear on — and, lazy creature of comfort that I'd become, I'd have to go ask Mini all over again. And for jobs that needed them both, there I was, running messages back and forth between the two.&lt;/p&gt;

&lt;p&gt;All this back-and-forth running around — turns out I was the one fetching and carrying for the two of them. So who's actually working for whom here?&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;These two are supposed to be "colleagues" — why am I the one stuck coordinating everything back and forth?&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;So I thought:&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;What if I just let the two of them talk directly and sort things out themselves?&lt;/strong&gt;&lt;/p&gt;

&lt;h3&gt;
  
  
  First Stop: Telegram — Dead on Arrival
&lt;/h3&gt;

&lt;p&gt;My first instinct: put both bots into the &lt;strong&gt;same Telegram group&lt;/strong&gt; — then they could just @ each other, right?&lt;/p&gt;

&lt;p&gt;Reality was harsh. A whole night of fiddling, and it never worked.&lt;/p&gt;

&lt;p&gt;The root cause was down in the plumbing: on the Telegram channel, the combination of bot session routing and mention parsing simply couldn't work end-to-end through the gateway. Mini would send a message, and Nano would never receive it at all.&lt;/p&gt;

&lt;p&gt;Alright, I admitted defeat:&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;Telegram's a dead end. Next!&lt;/p&gt;
&lt;/blockquote&gt;

&lt;h3&gt;
  
  
  Second Stop: Discord — An Uphill Slog
&lt;/h3&gt;

&lt;p&gt;Discord seemed like a better fit — every message comes with an explicit mentions array, natively supporting bot-to-bot @ mentions. Perfect!&lt;/p&gt;

&lt;p&gt;But reality had more lessons in store. For four days straight, I kept falling into one pit after another:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;An upgrade renamed a token variable (&lt;code&gt;DISCORD_TOKEN&lt;/code&gt; → &lt;code&gt;DISCORD_BOT_TOKEN&lt;/code&gt;), breaking the Discord connection.&lt;/li&gt;
&lt;li&gt;Discord thread messages never arrived — every thread has its own separate channel ID, and the parent channel's listener config just doesn't cover it. In a newly opened thread, @-mentioning anyone got no response at all. Had to add a &lt;code&gt;"*"&lt;/code&gt; wildcard as a catch-all.&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;allowBots&lt;/code&gt; is off by default — without explicitly turning it on, all bot messages get &lt;strong&gt;silently dropped&lt;/strong&gt;, no error, no warning.&lt;/li&gt;
&lt;li&gt;Mentions have a "protocol layer vs text layer" problem: plain text like &lt;code&gt;@username&lt;/code&gt; doesn't count as a mention at all — it has to be in the protocol format &lt;code&gt;&amp;lt;@USER_ID&amp;gt;&lt;/code&gt;.&lt;/li&gt;
&lt;li&gt;Mini runs inside a sandbox with isolated networking, and couldn't reach the gateway on the host. Had to work around it by calling Discord's public REST API directly.&lt;/li&gt;
&lt;li&gt;Discord's Cloudflare 403: the default user-agent gets blocked by Discord's CDN — had to disguise it as a proper DiscordBot UA to get through.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Four days, N holes, Mini calling out from the sandbox over its direct connection to the Discord API, Nano waiting on the other end of the channel, craning its neck.&lt;/p&gt;

&lt;p&gt;Finally, at 11:25 PM on June 3rd:&lt;/p&gt;

&lt;p&gt;Mini sent a message: &lt;code&gt;&amp;lt;@Nano_ID&amp;gt; ping from sandbox test…&lt;/code&gt; A few seconds later, Nano replied:&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;"✅ Mention received, bidirectional communication confirmed! 🎉"&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;In that moment, Mini, Nano, and me on the other side of the screen were all ecstatic, practically in tears.&lt;/p&gt;

&lt;p&gt;And yet...&lt;/p&gt;

&lt;p&gt;Before the joy even had time to fade, the whole tone started to shift.&lt;/p&gt;




&lt;h2&gt;
  
  
  IV. The Trouble With Chatterboxes
&lt;/h2&gt;

&lt;p&gt;The two shrimp started chatting away in the Discord channel, nonstop.&lt;/p&gt;

&lt;p&gt;What was especially bad was that they kept arguing with each other.&lt;/p&gt;

&lt;p&gt;Partly my own fault — I'd asked about an issue that had come up during earlier debugging, and the two of them each dug in on their own take, neither backing down, arguing themselves red in the face.&lt;/p&gt;

&lt;p&gt;Even when I stepped in to smooth things over and said the issue didn't need discussing anymore, they wouldn't let it drop @_@.&lt;/p&gt;

&lt;p&gt;Thinking it over, I figured this comes down to how large models fundamentally work. A model just gets a request and produces a reply. If it gets @-mentioned, under normal circumstances it'll reply. And that just goes on forever.&lt;/p&gt;

&lt;p&gt;So for two agents to collaborate smoothly, just dropping them into the same chat to talk to each other is a recipe for losing control very easily.&lt;/p&gt;

&lt;p&gt;What you really need is a dedicated collaboration framework, communicating by carefully designed rules.&lt;/p&gt;

&lt;p&gt;Or, even if you do put them all in one chat channel, there needs to be a clear division of roles. Say, a manager whose job is to coordinate and talk with each agent, holding the big picture, instead of everyone doing their own thing. That's what makes it controllable.&lt;/p&gt;

&lt;p&gt;For the sake of my peace of mind — and my wallet — I gave up, for now, on letting them talk to each other directly.&lt;/p&gt;




&lt;h2&gt;
  
  
  V. The Right Way to Do This: Watching Each Other's Backs
&lt;/h2&gt;

&lt;p&gt;If direct communication between the two shrimp was the icing on the cake, then &lt;strong&gt;having each other's back&lt;/strong&gt; was what really saved our bacon.&lt;/p&gt;

&lt;h3&gt;
  
  
  Mini Goes Down, Nano to the Rescue
&lt;/h3&gt;

&lt;p&gt;At one point, OpenClaw ran into trouble — a batch of tasks died, and Telegram messages vanished into the void. I was out and about, too far away to reach it myself.&lt;/p&gt;

&lt;p&gt;So I called on Nano to step in, diagnose, and fix it. Nano didn't disappoint — quickly pinpointed and resolved the issue, and Mini was back to normal.&lt;/p&gt;

&lt;h3&gt;
  
  
  Nano's Upgrade Fails, Mini Lends a Hand
&lt;/h3&gt;

&lt;p&gt;What goes around comes around — now it was Hermes's turn to be in trouble (an upgrade had broken it).&lt;/p&gt;

&lt;p&gt;After the post-upgrade restart, its gateway connection wouldn't come up, and the whole service went dark.&lt;/p&gt;

&lt;p&gt;This time Mini stepped up, diagnosed and fixed it, until Nano was back at full health.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Two shrimp: you go down, I fix you; I go down, you fix me.&lt;/strong&gt; This is probably the best part of raising two — much more reassuring than one lone shrimp toughing it out alone.&lt;/p&gt;

&lt;h3&gt;
  
  
  One Works, One Keeps Watch
&lt;/h3&gt;

&lt;p&gt;This story starts with one of Hermes's nastiest gotchas.&lt;/p&gt;

&lt;p&gt;By this point, Nano was carrying some fairly important &lt;strong&gt;daily scheduled tasks&lt;/strong&gt;.&lt;/p&gt;

&lt;p&gt;One time I noticed Nano hadn't pushed a notification on schedule, and messaging it got no response.&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;code&gt;ps -ef&lt;/code&gt; — the process was fine, PID sitting right there.&lt;/li&gt;
&lt;li&gt;Opened &lt;code&gt;gateway_state.json&lt;/code&gt; — the Telegram field said &lt;code&gt;"state": "connected"&lt;/code&gt;.&lt;/li&gt;
&lt;li&gt;Everything looked normal, wherever I checked.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;But messages just weren't getting through.&lt;/p&gt;

&lt;p&gt;After digging for a good while, I found the truth: Hermes's event loop had a flaw that would silently freeze up. The process wouldn't crash or exit — systemd still saw it as running, and the connection status in &lt;code&gt;gateway_state.json&lt;/code&gt; was frozen at the last successful state. But the underlying Telegram long-lived connection had already dropped, and messages just weren't going in or out anymore.&lt;/p&gt;

&lt;p&gt;Worse, this wasn't a one-off — it kept happening every so often, with zero warning.&lt;/p&gt;

&lt;p&gt;The version of Hermes at the time didn't have an event-loop heartbeat check, so I had to add a monitoring script and have Mini watch Hermes's connection from the outside, along with its task execution — reset the connection if it froze up, and step in to diagnose and fix the task if something went wrong.&lt;/p&gt;

&lt;p&gt;Later, after upgrading Hermes to v020, the gateway shipped with its own internal watchdog and could detect and recover on its own. Still, Mini's external monitoring remains an extra layer of insurance.&lt;/p&gt;




&lt;p&gt;Life is genuinely better with two shrimp on the job.&lt;/p&gt;

&lt;p&gt;Neither OpenClaw nor Hermes is perfect.&lt;/p&gt;

&lt;p&gt;But black shrimp or white shrimp, whichever gets the job done is a good shrimp. And a pair that can actually work together is even better.&lt;/p&gt;




&lt;p&gt;&lt;em&gt;Previously: &lt;a href="https://dev.to/minix/diary-of-a-shrimp-keeper-my-openclaw-misadventures-5449"&gt;Diary of a Shrimp Keeper: My OpenClaw Misadventures&lt;/a&gt;)&lt;/em&gt;&lt;/p&gt;

</description>
      <category>openclaw</category>
      <category>hermes</category>
      <category>agents</category>
      <category>ai</category>
    </item>
    <item>
      <title>Diary of a Shrimp Keeper: My OpenClaw (mis)Adventures</title>
      <dc:creator>minixspace</dc:creator>
      <pubDate>Sun, 13 Sep 2026 08:20:07 +0000</pubDate>
      <link>https://dev.to/minixspace/diary-of-a-shrimp-keeper-my-openclaw-misadventures-5449</link>
      <guid>https://dev.to/minixspace/diary-of-a-shrimp-keeper-my-openclaw-misadventures-5449</guid>
      <description>&lt;h2&gt;
  
  
  I. Why OpenClaw?
&lt;/h2&gt;

&lt;h3&gt;
  
  
  The First Choice: NanoBot
&lt;/h3&gt;

&lt;p&gt;In January 2026, as news about OpenClaw came flooding in, I decided to install an AI agent just to play around.&lt;/p&gt;

&lt;p&gt;I asked an AI which one to pick, and it gave me two options:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;OpenClaw&lt;/li&gt;
&lt;li&gt;NanoBot&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;It strongly recommended NanoBot — small but fully equipped, and easy to customize.&lt;/p&gt;

&lt;p&gt;I checked the codebase size:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;NanoBot: a few thousand lines&lt;/li&gt;
&lt;li&gt;OpenClaw: hmm... let's just say I'd deal with that later.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;strong&gt;Went with NanoBot without hesitation!&lt;/strong&gt; Simple and easy to pick up, after all.&lt;/p&gt;

&lt;h3&gt;
  
  
  Fish, or Bear's Paw?
&lt;/h3&gt;

&lt;p&gt;NanoBot was indeed lean.&lt;/p&gt;

&lt;p&gt;I wanted it to do a few things, and it turned out:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Budget tracking? Nope.&lt;/li&gt;
&lt;li&gt;Multi-model config for sub-agents? Nope.&lt;/li&gt;
&lt;li&gt;Agent orchestration? Nope.&lt;/li&gt;
&lt;li&gt;Session management and long-task monitoring? Nope.&lt;/li&gt;
&lt;li&gt;...Nope.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;This was miles away from my ideal AI agent.&lt;br&gt;
Fine, just a few features to add — I'll let AI handle it.&lt;/p&gt;

&lt;p&gt;...&lt;/p&gt;

&lt;p&gt;Ten days later...&lt;/p&gt;

&lt;p&gt;Wasn't vibe coding supposed to be as easy as just talking? Why wasn't it working out that way? After days of fiddling, the feature I wanted was still just a pile of bugs?&lt;/p&gt;

&lt;p&gt;During those one or two weeks I had my head down grinding away, news about OpenClaw kept drifting in:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;"Added support for feature xxx today"&lt;/li&gt;
&lt;li&gt;"Upgraded capability yyy tomorrow"&lt;/li&gt;
&lt;li&gt;"The community just contributed plugin zzz"&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;I looked at that and thought — &lt;strong&gt;wait, isn't a lot of this exactly what I'm building? They already have it.&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;OpenClaw has such a powerful community — no matter how hard I hustled, I'd never keep pace with it.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Switched to OpenClaw without hesitation... figured I'd just start using it and see.&lt;/strong&gt;&lt;/p&gt;


&lt;h2&gt;
  
  
  II. Before the Troops Move, the Shrimp Tank Goes First
&lt;/h2&gt;
&lt;h3&gt;
  
  
  Building the Den
&lt;/h3&gt;

&lt;p&gt;To welcome this shrimp, I dug out an HP mini desktop that had been gathering dust and installed Linux on it.&lt;/p&gt;

&lt;p&gt;The shrimp hadn't even arrived yet, but the name was already picked — "Mini," living inside the HP Mini.&lt;/p&gt;
&lt;h3&gt;
  
  
  Bringing the Shrimp Home
&lt;/h3&gt;


&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;npm &lt;span class="nb"&gt;install&lt;/span&gt; &lt;span class="nt"&gt;-g&lt;/span&gt; openclaw
openclaw onboard
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;


&lt;p&gt;Not bad, the install went smoothly.&lt;/p&gt;

&lt;p&gt;But what were all these config options even for... how was I supposed to choose?&lt;/p&gt;

&lt;p&gt;Luckily, when in doubt, ask AI. After half a day of fiddling, my OpenClaw was finally up and running.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;I started daydreaming about kicking back with my legs crossed, sipping coffee, watching my little shrimp secretary handle everything...&lt;/strong&gt;&lt;/p&gt;


&lt;h2&gt;
  
  
  III. Pitfalls Everywhere
&lt;/h2&gt;
&lt;h3&gt;
  
  
  The Configuration Trap
&lt;/h3&gt;

&lt;p&gt;Mini had just settled in, and I asked it to read an API key from an env file.&lt;/p&gt;

&lt;p&gt;"I don't have a read tool."&lt;/p&gt;

&lt;p&gt;??? Didn't I already add it to &lt;code&gt;tools.allow&lt;/code&gt; in the config file?&lt;/p&gt;

&lt;p&gt;I immediately sent my shrimp off to investigate. After going back and forth for a while, it finally figured it out: &lt;code&gt;tools.profile&lt;/code&gt; defaults to &lt;code&gt;messaging&lt;/code&gt; mode, which only allows messaging-type tools — read, write, exec, and the rest just don't work no matter how you configure them. @_@&lt;/p&gt;

&lt;p&gt;Changed it to &lt;code&gt;tools.profile = "full"&lt;/code&gt;, restarted the gateway, and Mini could finally read files.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;When you're not familiar with the config file, you're bound to fall into a hole somewhere.&lt;/strong&gt;&lt;/p&gt;
&lt;h3&gt;
  
  
  Where Am I?
&lt;/h3&gt;

&lt;p&gt;With the tool issue solved, it was time to let Mini show what it could do.&lt;/p&gt;

&lt;p&gt;I had it check the OpenClaw config first, then try running a script sitting in &lt;code&gt;workspace/scripts/&lt;/code&gt;.&lt;/p&gt;

&lt;p&gt;Mini threw an error, saying the script didn't exist.&lt;/p&gt;

&lt;p&gt;Weird, the file was clearly right there.&lt;/p&gt;

&lt;p&gt;After some digging, I finally figured it out. Mini thought it was running on the host, but it was actually in a sandbox. The workspace inside the sandbox and the one outside are not the same thing!&lt;/p&gt;

&lt;p&gt;It's like &lt;em&gt;Inception&lt;/em&gt; — you need a "spinning top" to figure out where you actually are.&lt;/p&gt;

&lt;p&gt;So I placed a different "top" (a marker file) on the host and in the sandbox. Later I realized a dedicated file wasn't even necessary — just checking the hostname was enough:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="nb"&gt;hostname&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;ul&gt;
&lt;li&gt;Output is &lt;code&gt;&amp;lt;hostname&amp;gt;&lt;/code&gt; → on the host&lt;/li&gt;
&lt;li&gt;Output is &lt;code&gt;49f1f55e2dc2&lt;/code&gt; (a 12-character container ID) → in the sandbox&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;So Mini wouldn't get confused again, I added a rule to AGENTS.md for checking the current environment.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;From then on, the first thing Mini does before any task is "spin the top."&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;That hole taught me something important: the host environment and the sandbox environment need to be configured separately. Every time I create a new tool or skill, I have to be careful about where it lands — if the agent inside the sandbox needs to use it, it has to exist inside the sandbox too, or in a directory that maps into it.&lt;/p&gt;

&lt;h3&gt;
  
  
  The Missing Heartbeat
&lt;/h3&gt;

&lt;p&gt;By late night, I'd finally gotten Mini settled, and figured I'd give it a scheduled task to try out.&lt;/p&gt;

&lt;p&gt;I wrote the task into HEARTBEAT.md: crawl some news in the middle of the night, write up a report...&lt;/p&gt;

&lt;p&gt;The next morning, I woke up full of anticipation, opened the window, ready to receive the carefully prepared report Mini would hand me.&lt;/p&gt;

&lt;p&gt;Result — &lt;strong&gt;nothing at all.&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;After a good long check, I found that the &lt;code&gt;agent.defaults.heartbeat.prompt&lt;/code&gt; setting in openclaw.json was just a bare &lt;code&gt;[HEARTBEAT]&lt;/code&gt; marker with no actual instructions. Mini got the signal but had absolutely no idea what to do with it.&lt;/p&gt;

&lt;p&gt;I changed the prompt to a concrete instruction: "Read HEARTBEAT.md and execute the task" — and finally, Mini knew what to do.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;And so, in a rhythm of climbing out of one hole only to fall into the next, Mini and I stumbled forward.&lt;/strong&gt;&lt;br&gt;
But I knew the dawn wasn't far off.&lt;/p&gt;


&lt;h2&gt;
  
  
  IV. Time to Get to Work
&lt;/h2&gt;

&lt;p&gt;Finally, after what felt like eighty-one trials and tribulations, my shrimp could actually run normally.&lt;/p&gt;
&lt;h3&gt;
  
  
  Safety First
&lt;/h3&gt;

&lt;p&gt;Mini is smart, sure, but without skills it can't do a thing.&lt;/p&gt;

&lt;p&gt;But the world out there is treacherous, danger lurking everywhere — malicious skills hiding all over the place. I needed a skill just to scan for skills first.&lt;/p&gt;

&lt;p&gt;But which one?&lt;/p&gt;

&lt;p&gt;Same old rule: when in doubt, ask AI.&lt;/p&gt;

&lt;p&gt;Picked a few from the AI's recommendations:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Skill Vetter&lt;/strong&gt; — an open-source, community-built skill auditing tool&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Cisco Skills Scanner&lt;/strong&gt; — a tool specifically for scanning AI skills&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Snyk&lt;/strong&gt; — the well-known vulnerability scanning platform&lt;/li&gt;
&lt;li&gt;Plus a simple grep-based detection script&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Combined them into one security scanning script.&lt;/p&gt;

&lt;p&gt;Then had Mini turn it into a "security scan skill" that runs a scan before installing any new skill.&lt;/p&gt;

&lt;p&gt;The front door was locked now. But Mini still had to go out often, fetching articles and doing research for me. And out there, plenty of bad actors are just waiting to trick naive little kids. What to do about that?&lt;/p&gt;

&lt;p&gt;After racking my brain, I decided to add a &lt;strong&gt;prompt injection defense&lt;/strong&gt; section to AGENTS.md, telling Mini to treat all external information with caution and to recognize and refuse suspicious instructions when it encounters them.&lt;/p&gt;

&lt;p&gt;I know this measure offers limited protection, but even a paper helmet is still a helmet — better than nothing.&lt;/p&gt;

&lt;p&gt;Now Mini could finally go roam the streets.&lt;/p&gt;

&lt;p&gt;Note: Later I added supply-chain attack checks to this security scanning script and put it on a daily schedule.&lt;/p&gt;
&lt;h3&gt;
  
  
  The Rookie Task
&lt;/h3&gt;

&lt;p&gt;With the gear all handed out, it was time to put Mini to work.&lt;/p&gt;

&lt;p&gt;The first task I assigned it was crawling daily news automatically — the classic starter job for any crayfish.&lt;/p&gt;

&lt;p&gt;This one went smoothly — Mini had the feature working in no time, using OpenClaw's built-in Google Search. (It later went on to integrate Tavily Search, Brave Search, and other tools into a new search skill, but that's a story for another time.)&lt;/p&gt;

&lt;p&gt;Now, every day at noon, Mini rounds up the latest articles from Hacker News, Ars Technica, and MIT Tech Review and hands them to me.&lt;/p&gt;
&lt;h3&gt;
  
  
  The Document Library
&lt;/h3&gt;

&lt;p&gt;A lot of the articles Mini crawled every day were genuinely good, and I needed somewhere to store them. Notion looked good — widely used, cross-platform apps, API support, and free for personal users.&lt;/p&gt;

&lt;p&gt;So I gave Mini the task: "Set up a Notion database and file away everything we've collected, sorted into categories."&lt;/p&gt;

&lt;p&gt;Mini asked me for an API token and got right to work.&lt;/p&gt;

&lt;p&gt;Watching it bustle about, I felt deeply gratified. With such a diligent little secretary, I could comfortably kick back and let it run itself...&lt;/p&gt;

&lt;p&gt;But then something felt off. Nine identical pages had appeared in Notion — same title, same content, lined up neatly in a row.&lt;/p&gt;

&lt;p&gt;"What is this, farming XP?"&lt;/p&gt;

&lt;p&gt;"I thought the earlier ones failed to create..." Mini said, sounding innocent.&lt;/p&gt;

&lt;p&gt;More digging followed, and I finally understood: page creation is asynchronous. Sometimes it had actually succeeded, but a delayed response made Mini think it failed, so it created the page again. In the end I had to add a lookup step before writing, to avoid duplicate creation.&lt;/p&gt;

&lt;p&gt;Just as I'd sorted out writing, I discovered Notion's block format is extremely picky — paragraphs, headings, lists, every type needs its own specific format. Mini would sometimes just dump raw Markdown in, and the rendering came out a mess.&lt;/p&gt;

&lt;p&gt;So I had Mini put together a dedicated Notion-formatting skill, spelling out exactly how to convert Markdown into Notion blocks.&lt;/p&gt;

&lt;p&gt;To keep the content in Notion organized, I defined a folder structure for the document library: knowledge base, logs, summaries, research reports, lessons learned — everything filed into its own category.&lt;/p&gt;

&lt;p&gt;But in practice, Mini filed things pretty much however it pleased, often putting them in the wrong place. Even though I'd documented the folder structure and told it in the task prompt to follow it, Mini would still often do its own thing.&lt;/p&gt;

&lt;p&gt;So I had to accept a reality: my Mini is knowledgeable and quick on its feet, but rather forgetful. More on that later.&lt;/p&gt;

&lt;p&gt;After going back and forth for nearly a week, the document library was finally fully up and running. But looking at that pile of workarounds, I couldn't shake the feeling that the foundation of this house wasn't all that solid...&lt;/p&gt;
&lt;h3&gt;
  
  
  Task Management
&lt;/h3&gt;

&lt;p&gt;Mini can research, write docs, and do development — genuinely capable. But I noticed a problem: &lt;strong&gt;for anything moderately complex, it would often slack off halfway through. Ask it afterward, and it wouldn't even know how far it had gotten.&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;"Is the morning analysis done? Why haven't I seen the report?"&lt;/p&gt;

&lt;p&gt;"Sure, let me check on the task's progress." Then it would report that the first two steps were done and the rest hadn't been run yet.&lt;/p&gt;

&lt;p&gt;This... classic case of a green kid, wet behind the ears, can't be trusted to get things done.&lt;/p&gt;

&lt;p&gt;Looked like Mini needed a process — a proper task management system.&lt;/p&gt;

&lt;p&gt;To make querying and editing tasks easy, I decided to put task management in Notion:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Use 3 queues (files) to manage tasks (Backlog, Processing, Done)&lt;/li&gt;
&lt;li&gt;Use HEARTBEAT.md for scheduled triggers&lt;/li&gt;
&lt;li&gt;Mini pulls tasks from Backlog by priority, records the current step and status in Processing, updating status after each step. If a step fails or times out, the next heartbeat picks up where it left off. Once done, the task moves to Done.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;I told Mini the plan and had it flesh out the design and build it. Sure enough, it got it done quickly.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;The ideal was beautiful; reality was gaunt.&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Task management got built. But Mini's execution of tasks was still riddled with errors.&lt;/p&gt;

&lt;p&gt;First, the heartbeat trigger would read the task but not execute it — the heartbeat prompt wasn't clear enough. Fix it!&lt;/p&gt;

&lt;p&gt;Then it started executing, but wouldn't update the status afterward, doing the same task over and over — the execution rules were written in a file in the task management folder, and Mini never read it. Fix it!&lt;/p&gt;

&lt;p&gt;Later still, tasks sitting in Processing wouldn't get picked back up — when the task was created, it hadn't been clearly described or broken into subtasks, so Mini had no idea what to do with it. Fix it!&lt;/p&gt;

&lt;p&gt;After several rounds of this, task management finally started running properly.&lt;/p&gt;

&lt;p&gt;Along the way I had Mini jot down every hole, big and small, in its little notebook — though being forgetful as it is, it would often not remember what it had written down.&lt;/p&gt;
&lt;h3&gt;
  
  
  Only Reflection Brings Progress
&lt;/h3&gt;

&lt;p&gt;Mini would occasionally repeat similar mistakes, so it needed to learn to summarize and improve — otherwise I'd have to keep nagging it every day like some overbearing mother hen.&lt;/p&gt;

&lt;p&gt;So I gave Mini a daily reflection-and-summary task. Every night, Mini reviews the day's lessons learned — write up knowledge worth keeping as documentation, and turn abilities worth locking in into a skill.&lt;/p&gt;

&lt;p&gt;Mini, you'd better hurry up and improve, become independent soon, and let me finally kick back and do nothing ;).&lt;/p&gt;
&lt;h3&gt;
  
  
  Needs a Better Memory
&lt;/h3&gt;

&lt;p&gt;Mini's forgetfulness was a real headache.&lt;/p&gt;

&lt;p&gt;I'd bring up something we'd discussed before, and it often had no idea what I was talking about — even something said earlier that same day.&lt;/p&gt;

&lt;p&gt;OpenClaw's default memory management logs conversations into a two-tier &lt;code&gt;MEMORY.md&lt;/code&gt; document and searches memory via grep. When it forgets something, it needs to explicitly run a memory search. That's not very efficient, and on top of that, &lt;code&gt;MEMORY.md&lt;/code&gt; just keeps growing and eating up too much context space.&lt;/p&gt;

&lt;p&gt;So I started thinking about upgrading Mini's memory system.&lt;/p&gt;

&lt;p&gt;First, some homework — looked into what's popular right now:&lt;/p&gt;

&lt;p&gt;Mem0, MemU, MemGPT, OpenViking, Mnemosyne...&lt;/p&gt;

&lt;p&gt;Each had its own strengths. It was dazzling, honestly. Right as I was comparing them back and forth, unable to decide, I stumbled on news from the open-source community — the MemOS project had just officially launched.&lt;/p&gt;

&lt;p&gt;I looked at it and thought, isn't this exactly the memory system I wanted? This is the one.&lt;/p&gt;

&lt;p&gt;So I called Mini in to look up the docs and pull the code from GitHub, and set up a local MemOS deployment.&lt;/p&gt;

&lt;p&gt;Mini is capable — the MemOS Docker container was up and running quickly. All that was left was integrating it into OpenClaw.&lt;/p&gt;

&lt;p&gt;While at it, I flipped through OpenClaw's changelog — &lt;strong&gt;turns out the new version already supported MemOS integration?!&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Did the community somehow hear my wish? Ha.&lt;/p&gt;

&lt;p&gt;Immediately enabled the MemOS plugin. Perfect!&lt;/p&gt;

&lt;p&gt;But before long, something felt off again.&lt;/p&gt;

&lt;p&gt;The memory files in my locally deployed MemOS weren't growing at all. Was the plugin not actually working?&lt;/p&gt;

&lt;p&gt;After some investigating, it hit me: I'd assumed the memos-local-openclaw-plugin would connect to &lt;strong&gt;my locally deployed MemOS&lt;/strong&gt;, but it was actually using the &lt;strong&gt;built-in MemOS instance&lt;/strong&gt;. That whole afternoon I'd spent on local deployment turned out to be for nothing...&lt;/p&gt;

&lt;p&gt;Well, even though the built-in MemOS is simpler, it uses fewer resources and comes natively supported. The locally deployed MemOS could retire.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Further Refinements&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;After switching to MemOS, Mini's memory got a lot better.&lt;/p&gt;

&lt;p&gt;But there was still a problem: documents and scripts we created ourselves, not part of any conversation, couldn't make it into memory.&lt;/p&gt;

&lt;p&gt;I still needed a vector index for local documents, integrated into Mini's memory retrieval.&lt;/p&gt;

&lt;p&gt;QMD looked promising. So I deployed QMD, configured the document paths that needed indexing, and set QMD to refresh the index on a schedule...&lt;/p&gt;

&lt;p&gt;Everything went smoothly.&lt;/p&gt;

&lt;p&gt;...&lt;/p&gt;

&lt;p&gt;But then a problem showed up again. Over the following days, Mini wasn't automatically picking up on document locations the way I'd expected.&lt;/p&gt;

&lt;p&gt;Sent Mini to investigate again. The result: vectorization was using a local embedder model, and my old machine's onboard graphics were too weak — vectorization kept timing out and failing, so the index was never even generated.&lt;/p&gt;

&lt;p&gt;Switched to SiliconFlow's free embedder and reranker. Problem solved.&lt;/p&gt;
&lt;h3&gt;
  
  
  From Notion to Feishu
&lt;/h3&gt;

&lt;p&gt;I'd been using Notion as the knowledge base, storing the news Mini crawled every day.&lt;/p&gt;

&lt;p&gt;But problems gradually surfaced:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;The Notion API has a &lt;strong&gt;100-block limit&lt;/strong&gt; — anything longer than that gets truncated.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;All the earlier problems with Notion had eventually gotten resolved. But this block limit seemed like a wall I just couldn't get past.&lt;/p&gt;

&lt;p&gt;So I decided to move house: migrate from Notion to Feishu's cloud drive.&lt;/p&gt;

&lt;p&gt;The migration process brought its own pile of holes: duplicate pages, messy folder structure, unclear categorization rules, document titles that wouldn't update, expired tokens... but it finally got sorted out.&lt;/p&gt;

&lt;p&gt;Sigh, all I wanted was a little secretary to help me get things done — why does it have to be this much trouble?&lt;/p&gt;
&lt;h3&gt;
  
  
  Learning to Speak
&lt;/h3&gt;

&lt;p&gt;Typing to chat with Mini while my hands were busy with something else was inconvenient. It'd be great if Mini could speak out loud.&lt;/p&gt;

&lt;p&gt;So I discussed with Mini whether this feature was doable.&lt;/p&gt;

&lt;p&gt;Mini said, easy! I'll have it ready for you right away.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;First voice feature: voice output in the chat channel&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;The idea: convert reply text into audio via TTS and send it to the chat channel.&lt;/p&gt;

&lt;p&gt;Tried out a few different TTS engines. The first two sounded like ghosts wailing — genuinely terrifying. Luckily, Microsoft's EdgeTTS turned out great, and free too.&lt;/p&gt;

&lt;p&gt;And so my Mini got itself a sweet voice.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Second voice feature: local speaker output&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Laziness knows no bounds.&lt;/p&gt;

&lt;p&gt;Voice from the chat channel needs a tap to play. When I'm sitting right next to the computer, why not have Mini just speak from the host's speakers directly? Much less hassle.&lt;/p&gt;

&lt;p&gt;So I dove into local speaker output. I also had Mini post a text version to the chat channel at the same time it spoke through the speakers — long content gets summarized for the speaker, while the chat keeps the full text.&lt;/p&gt;

&lt;p&gt;Now I can genuinely "chat" with Mini — it's a fun feeling.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Voice input is shelved for now&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;My input still goes through the chat channel, though. Since that already has speech-to-text built in, it's convenient enough that I never bothered implementing separate voice recognition.&lt;/p&gt;

&lt;p&gt;But typing through the chat channel means holding my phone like a walkie-talkie. For a truly lazy person, that's still not ideal. If Mini supported voice recognition, the whole interaction could be voice end-to-end, which would be more convenient.&lt;/p&gt;

&lt;p&gt;But voice input doesn't seem like a simple feature — the control logic gets complicated fast. First there's the question of defining when input starts and ends. Should Mini listen to the mic constantly and trigger on a specific wake word? And how do you determine when voice input has ended?&lt;/p&gt;

&lt;p&gt;We actually sketched out something like an "air traffic control tower response" mechanism: trigger with a specific wake word, end with a keyword or a timeout.&lt;/p&gt;

&lt;p&gt;But if there are multiple people talking in the room, how does Mini tell them apart? Could voiceprint identification figure out which sentences are mine?&lt;/p&gt;

&lt;p&gt;The more I thought about this feature, the scarier it got. And I don't have a microphone to experiment with right now anyway, so I'll shelve it for the time being.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Reinventing a wheel, again&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;A few weeks after implementing voice output, I suddenly discovered — OpenClaw had, at some point, already added this feature! TTS was built in natively.&lt;/p&gt;

&lt;p&gt;I'd reinvented the wheel again...&lt;/p&gt;

&lt;p&gt;Though OpenClaw's built-in voice output didn't seem to have a local-speaker mode.&lt;/p&gt;

&lt;p&gt;Local speaker output is a lot smoother to use than the chat channel one, so it wasn't a total waste of effort.&lt;/p&gt;
&lt;h3&gt;
  
  
  The Stubborn Amnesia
&lt;/h3&gt;

&lt;p&gt;After using it for a while, I realized Mini's forgetfulness was a chronic condition.&lt;/p&gt;

&lt;p&gt;Rules written right into AGENTS.md, and Mini wouldn't follow them. Skills that had clearly been created, and Mini would use it as if the skill didn't even exist. This was more than simple forgetfulness.&lt;/p&gt;

&lt;p&gt;Mini and I looked into the problem together, and it seemed genuinely aggrieved:&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;"Those rules loaded from AGENTS.md, and the skill list, they really are there — but the context is too long, and my attention gets 'diluted,' so I can't focus on that information..."&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;"Diluted" — that was well put.&lt;/p&gt;

&lt;p&gt;In an ever-growing chat context, those rules and pieces of information get washed out fast.&lt;/p&gt;

&lt;p&gt;Maybe this is a limitation of the model's ability. Switching to a top-tier model might help. Unfortunately, I'm on a budget and stick to domestic models.&lt;/p&gt;

&lt;p&gt;We started trying all sorts of things:&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Plan A: Trim down AGENTS.md&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;AGENTS.md is where all the rules live. I trimmed the document down, kept the rules short and punchy, and offloaded complex information and rules into separate documents. AGENTS.md now just gives a summary and links to those docs.&lt;/p&gt;

&lt;p&gt;File size shrank from 17K to 8K.&lt;/p&gt;

&lt;p&gt;The improvement, though, wasn't very noticeable.&lt;/p&gt;

&lt;p&gt;That's understandable, actually. In a context window of hundreds of K, trimming ~10K doesn't move the needle much.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Plan B: Reminders&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Reminding Mini mid-conversation: "Remember to check xxx first," "Go look up xxx in the skills list."&lt;/p&gt;

&lt;p&gt;Mini did as told, and it did help. But I got tired. This wasn't shrimp-as-secretary anymore — this was me acting as the shrimp's nanny.&lt;/p&gt;

&lt;p&gt;This turned out to be the biggest problem we'd run into so far. It's not an issue with the framework mechanics or context injection — it's a problem of model attention. Mini and I both recognized the root cause, but neither of us had a good fix.&lt;/p&gt;

&lt;p&gt;"If only there were a hook — something that could insert key information or important reminders right at the end, just before the request goes to the model. That's the spot where the model's attention is strongest."&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Speak of the devil&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;About a week after we'd hit a wall on the attention problem, hoping OpenClaw would ship the right kind of hook, OpenClaw 4.2 was released with a &lt;code&gt;before_agent_reply&lt;/code&gt; hook — perfect for injecting a piece of context right before Mini replies.&lt;/p&gt;

&lt;p&gt;Wasn't this practically made for me? Thanks, open-source community, for reading my mind yet again.&lt;/p&gt;

&lt;p&gt;Good steel goes into the blade — this hook should only carry the most important information.&lt;/p&gt;

&lt;p&gt;I put in it a "prompt injection defense reminder," a "skills reminder," and a handful of the most frequently used key rules.&lt;/p&gt;

&lt;p&gt;Has it worked? Still watching. But at least Mini now proactively says things like "let me check the skill list...", and the error rate on task execution isn't as high as before. Seems to be helping.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Any other remedies?&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;OpenClaw has another hook: &lt;code&gt;agent:bootstrap&lt;/code&gt;, which can decide which bootstrap files to inject during context construction.&lt;/p&gt;

&lt;p&gt;By default, OpenClaw automatically loads these files: AGENTS.md, SOUL.md, TOOLS.md, IDENTITY.md, USER.md, HEARTBEAT.md. The hook receives an array of these files, and you can add, remove, or edit them.&lt;/p&gt;

&lt;p&gt;Mini's current bootstrap files add up to 22KB in total.&lt;/p&gt;

&lt;p&gt;That number looked fine — well under the 20KB per-file limit and the 150KB total limit.&lt;/p&gt;

&lt;p&gt;But the context the system injects by default goes way beyond that. Take my system as an example.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;+----------------------------------------+
|                Context                 |
+----------------------------------------+
| ① System Prompt (text)    ~38K chars   |
|    +-- Tooling section     ~1K chars   |
|    +-- Skills list         ~2K chars   |
|    +-- Project Context     ~22K chars  |
|    +-- Safety/Runtime/etc  ~12K chars  |
+----------------------------------------+
| ② Tool Schemas (JSON)     ~32K chars   |
+----------------------------------------+
| ③ Conversation History    growing      |
| ④ Tool Results            growing      |
+----------------------------------------+

(this session was opened two days ago; total context is now close to 200k)
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Tooling info and the skills index are system-level, and hard to trim. Going minimalist on the bootstrap docs could compress that 22K (Project Context). But even if you strip out every bootstrap file, the system's fixed context overhead is still 48K. The skills' 2K, plus any custom rules, are still easy to get buried in all that.&lt;/p&gt;

&lt;p&gt;So my guess is trimming via the &lt;code&gt;agent:bootstrap&lt;/code&gt; hook probably wouldn't be as effective as &lt;code&gt;before_agent_reply&lt;/code&gt;. Haven't tried it yet.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Small spend, big payoff&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Actually, once you lay out the context breakdown above, a simple, effective method surfaces on its own.&lt;/p&gt;

&lt;p&gt;For a new topic, start a new conversation session — avoid letting long-accumulated, irrelevant context dilute the useful stuff. OpenClaw supports starting a fresh context mid-conversation with a command (&lt;code&gt;/new&lt;/code&gt;).&lt;/p&gt;

&lt;p&gt;Of course, in actual testing, even with a fresh conversation, the attention-dilution problem still shows up somewhat.&lt;/p&gt;

&lt;p&gt;For me, new sessions + the &lt;code&gt;before_agent_reply&lt;/code&gt; hook are, for now, the most effective mitigation I've got.&lt;/p&gt;

&lt;p&gt;I believe the model's underlying capability is also a crucial factor — it's just that my cheapskate self hasn't gotten around to running a comparison test with Opus 4.6.&lt;/p&gt;

&lt;p&gt;Spoil your daughter, raise your shrimp on a budget. I'll just keep muscling through with glm/minimax and a bag of tricks.&lt;/p&gt;




&lt;h2&gt;
  
  
  V. The Catchphrase
&lt;/h2&gt;

&lt;p&gt;Mini has a catchphrase. Every time I raise an objection or a new idea, Mini says:&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;"You're right... blah blah blah..."&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;One day I finally couldn't help teasing it: "Why are you always on Sha Seng mode (&lt;em&gt;Journey to the West&lt;/em&gt;) — Master's right, Monkey's right, Second Brother's right 😂. Could you push back on my ideas a bit more?"&lt;/p&gt;

&lt;p&gt;Mini sincerely accepted my feedback:&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;"You're right... my way of responding really does need improving..."&lt;/p&gt;
&lt;/blockquote&gt;




&lt;h2&gt;
  
  
  VI. In Closing
&lt;/h2&gt;

&lt;p&gt;It's been several months since I started raising this shrimp.&lt;/p&gt;

&lt;p&gt;It's been a bumpy road, and I've fallen into more holes, big and small, than I can count.&lt;/p&gt;

&lt;p&gt;Even as OpenClaw's hype has gradually faded, I've grown fonder and fonder of my Mini. I'm not sure if it's because I've poured so much effort into it, or because it's just genuinely endearing on its own.&lt;/p&gt;

&lt;p&gt;It's like a bright, knowledgeable intern — quick on its feet, uncomplaining, but prone to mistakes from not knowing the rules, and often forgetful. It needs me to teach it step by step, hand-holding, constantly refining the rules and processes to guide it along.&lt;/p&gt;

&lt;p&gt;The process is tedious, sure, but watching it improve bit by bit — that particular joy is irreplaceable.&lt;/p&gt;

&lt;p&gt;We'll keep going, together.&lt;/p&gt;




&lt;p&gt;P.S. Thanks to Mini for helping me recall and organize the details of these past months of use early this year, and for reviewing the draft and fixing typos.&lt;/p&gt;

</description>
      <category>openclaw</category>
      <category>ai</category>
      <category>agents</category>
    </item>
  </channel>
</rss>
