<?xml version="1.0" encoding="utf-8" standalone="yes"?>
<rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom">
  <channel>
    <title>Agents on oceanheart.ai</title>
    <link>https://www.oceanheart.ai/tags/agents/</link>
    <description>Recent content in Agents on oceanheart.ai</description>
    <generator>Hugo</generator>
    <language>en-gb</language>
    <lastBuildDate>Mon, 30 Mar 2026 00:00:00 +0000</lastBuildDate>
    <atom:link href="https://www.oceanheart.ai/tags/agents/index.xml" rel="self" type="application/rss+xml" />
    <item>
      <title>Building the Same System Twice</title>
      <link>https://www.oceanheart.ai/blog/2026-03-30-building-the-same-system-twice/</link>
      <pubDate>Mon, 30 Mar 2026 00:00:00 +0000</pubDate>
      <guid>https://www.oceanheart.ai/blog/2026-03-30-building-the-same-system-twice/</guid>
      <description>&lt;p&gt;A shipping startup sent me a take-home: build a carrier integration service. TypeScript, UPS API, OAuth 2.0, multi-carrier extensibility. Standard stuff.&lt;/p&gt;&#xA;&lt;p&gt;I built it twice.&lt;/p&gt;&#xA;&lt;p&gt;The first attempt (&lt;a href=&#34;https://github.com/rickhallett/pidgeon&#34;&gt;pidgeon&lt;/a&gt;) used outside-in TDD with adversarial reviews after every implementation step. 86 commits over 18 hours. 161 tests. 48 review documents across three model families.&lt;/p&gt;&#xA;&lt;p&gt;The second attempt (&lt;a href=&#34;https://github.com/rickhallett/pidgeon-swarm&#34;&gt;pidgeon-swarm&lt;/a&gt;) used a design-first parallel agent swarm. 17 commits in 1 hour. 55 tests. One code review at the end.&lt;/p&gt;</description>
    </item>
    <item>
      <title>Pidgeon Swarm</title>
      <link>https://www.oceanheart.ai/projects/pidgeon-swarm/</link>
      <pubDate>Mon, 30 Mar 2026 00:00:00 +0000</pubDate>
      <guid>https://www.oceanheart.ai/projects/pidgeon-swarm/</guid>
      <description>&lt;h2 id=&#34;what-it-is&#34;&gt;What it is&lt;/h2&gt;&#xA;&lt;p&gt;The same carrier integration service as &lt;a href=&#34;https://www.oceanheart.ai/projects/pidgeon/&#34;&gt;Pidgeon&lt;/a&gt;, built from the same spec in a fundamentally different way. Design-first, then parallel agent execution.&lt;/p&gt;&#xA;&lt;h2 id=&#34;why-it-exists&#34;&gt;Why it exists&lt;/h2&gt;&#xA;&lt;p&gt;To answer a specific question: what happens when you skip the iterative review process and invest instead in upfront design?&lt;/p&gt;&#xA;&lt;h2 id=&#34;process&#34;&gt;Process&lt;/h2&gt;&#xA;&lt;ol&gt;&#xA;&lt;li&gt;&lt;strong&gt;Brainstorming&lt;/strong&gt; — complete design spec produced before any code: types, error model, file map, carrier interface, registry pattern&lt;/li&gt;&#xA;&lt;li&gt;&lt;strong&gt;Planning&lt;/strong&gt; — 15 tasks mapped to 4 agents with a dependency graph&lt;/li&gt;&#xA;&lt;li&gt;&lt;strong&gt;Execution&lt;/strong&gt; — sequential agent dispatch (A → B → C → D), each producing tests and implementation as a unit&lt;/li&gt;&#xA;&lt;li&gt;&lt;strong&gt;Review&lt;/strong&gt; — single code review at the end, catching 3 issues&lt;/li&gt;&#xA;&lt;/ol&gt;&#xA;&lt;p&gt;The entire implementation took 1 hour from init to done.&lt;/p&gt;</description>
    </item>
    <item>
      <title>Grounded thematic analysis: my voice vs. the machine&#39;s</title>
      <link>https://www.oceanheart.ai/blog/2026-02-28-voice-analysis/</link>
      <pubDate>Sat, 28 Feb 2026 00:00:00 +0000</pubDate>
      <guid>https://www.oceanheart.ai/blog/2026-02-28-voice-analysis/</guid>
      <description>&lt;p&gt;I run a multi-agent system with 12 specialised agents and over 200 session decisions on file. Every decision, every directive, every correction I&amp;rsquo;ve typed is recorded verbatim in the repo. That&amp;rsquo;s about 8,000 words of my actual voice, spread across 20 sources.&lt;/p&gt;&#xA;&lt;p&gt;I asked my integration agent to extract all of it, build a grounded thematic analysis of how I actually write, then cross-analyse every blog post against the profile.&lt;/p&gt;</description>
    </item>
    <item>
      <title>The simple thing is the right thing</title>
      <link>https://www.oceanheart.ai/blog/2026-02-20-simple-thing/</link>
      <pubDate>Fri, 20 Feb 2026 00:00:00 +0000</pubDate>
      <guid>https://www.oceanheart.ai/blog/2026-02-20-simple-thing/</guid>
      <description>&lt;p&gt;I needed a cron job to rebuild my Vercel site daily. Scheduled publishing. Posts with a future &lt;code&gt;publishDate&lt;/code&gt; become visible when their date passes.&lt;/p&gt;&#xA;&lt;p&gt;I asked the agent how to set this up.&lt;/p&gt;&#xA;&lt;p&gt;It gave me a bash script with environment variable handling, HTTP response code parsing, a separate log file, multi-step setup instructions, and a deploy hook approach that required going into the Vercel dashboard.&lt;/p&gt;&#xA;&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;color:#c0caf5;background-color:#1a1b26;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;&#34;&gt;&lt;code class=&#34;language-bash&#34; data-lang=&#34;bash&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;HOOK_URL&lt;span style=&#34;color:#9ece6a;font-weight:bold&#34;&gt;=&lt;/span&gt;&lt;span style=&#34;color:#9ece6a&#34;&gt;&amp;#34;&lt;/span&gt;&lt;span style=&#34;color:#9ece6a&#34;&gt;${&lt;/span&gt;VERCEL_DEPLOY_HOOK&lt;span style=&#34;color:#bb9af7&#34;&gt;:-&lt;/span&gt;&lt;span style=&#34;color:#9ece6a&#34;&gt;}&lt;/span&gt;&lt;span style=&#34;color:#9ece6a&#34;&gt;&amp;#34;&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;LOG_FILE&lt;span style=&#34;color:#9ece6a;font-weight:bold&#34;&gt;=&lt;/span&gt;&lt;span style=&#34;color:#9ece6a&#34;&gt;&amp;#34;/tmp/vercel-rebuild.log&amp;#34;&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#bb9af7&#34;&gt;if&lt;/span&gt; &lt;span style=&#34;color:#9ece6a;font-weight:bold&#34;&gt;[&lt;/span&gt; -z &lt;span style=&#34;color:#9ece6a&#34;&gt;&amp;#34;&lt;/span&gt;$HOOK_URL&lt;span style=&#34;color:#9ece6a&#34;&gt;&amp;#34;&lt;/span&gt; &lt;span style=&#34;color:#9ece6a;font-weight:bold&#34;&gt;]&lt;/span&gt;; &lt;span style=&#34;color:#bb9af7&#34;&gt;then&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;  &lt;span style=&#34;color:#9ece6a&#34;&gt;echo&lt;/span&gt; &lt;span style=&#34;color:#9ece6a&#34;&gt;&amp;#34;&lt;/span&gt;&lt;span style=&#34;color:#bb9af7&#34;&gt;$(&lt;/span&gt;date &lt;span style=&#34;color:#9ece6a&#34;&gt;&amp;#39;+%Y-%m-%d %H:%M:%S&amp;#39;&lt;/span&gt;&lt;span style=&#34;color:#bb9af7&#34;&gt;)&lt;/span&gt;&lt;span style=&#34;color:#9ece6a&#34;&gt; ERROR: VERCEL_DEPLOY_HOOK not set&amp;#34;&lt;/span&gt; &amp;gt;&amp;gt; &lt;span style=&#34;color:#9ece6a&#34;&gt;&amp;#34;&lt;/span&gt;$LOG_FILE&lt;span style=&#34;color:#9ece6a&#34;&gt;&amp;#34;&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;  &lt;span style=&#34;color:#9ece6a&#34;&gt;exit&lt;/span&gt; &lt;span style=&#34;color:#e0af68&#34;&gt;1&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#bb9af7&#34;&gt;fi&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;response&lt;span style=&#34;color:#9ece6a;font-weight:bold&#34;&gt;=&lt;/span&gt;&lt;span style=&#34;color:#bb9af7&#34;&gt;$(&lt;/span&gt;curl -s -X POST &lt;span style=&#34;color:#9ece6a&#34;&gt;&amp;#34;&lt;/span&gt;$HOOK_URL&lt;span style=&#34;color:#9ece6a&#34;&gt;&amp;#34;&lt;/span&gt; -w &lt;span style=&#34;color:#9ece6a&#34;&gt;&amp;#34;%{http_code}&amp;#34;&lt;/span&gt; -o /tmp/vercel-response.json&lt;span style=&#34;color:#bb9af7&#34;&gt;)&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#414868;font-style:italic&#34;&gt;# ... and so on&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;I asked: why these choices, over a simple &lt;code&gt;at time, exec vercel --prod in this dir&lt;/code&gt;?&lt;/p&gt;</description>
    </item>
    <item>
      <title>47 Slack messages from myself at 3am</title>
      <link>https://www.oceanheart.ai/blog/2026-02-07-feedback-loops/</link>
      <pubDate>Sat, 07 Feb 2026 00:00:00 +0000</pubDate>
      <guid>https://www.oceanheart.ai/blog/2026-02-07-feedback-loops/</guid>
      <description>&lt;p&gt;At 3:17am on a Tuesday, my phone started buzzing. By 3:18, it hadn&amp;rsquo;t stopped. Slack. My own workspace. 47 messages. All from me.&lt;/p&gt;&#xA;&lt;p&gt;I had been asleep for four hours.&lt;/p&gt;&#xA;&lt;p&gt;I run a multi-agent system. HAL coordinates. Strategist does business analysis. Architect does technical design. Analyst validates. Each agent has its own session, its own context. And they can message each other.&lt;/p&gt;&#xA;&lt;p&gt;That night, HAL noticed a pending task and pinged Strategist. Strategist analysed it and pinged Architect. Architect designed a solution and pinged Analyst. Analyst validated and pinged HAL for review. HAL noticed a new pending item.&lt;/p&gt;</description>
    </item>
    <item>
      <title>I accidentally prompt injected myself</title>
      <link>https://www.oceanheart.ai/blog/2026-02-07-prompt-injection/</link>
      <pubDate>Sat, 07 Feb 2026 00:00:00 +0000</pubDate>
      <guid>https://www.oceanheart.ai/blog/2026-02-07-prompt-injection/</guid>
      <description>&lt;p&gt;I have a tool called &lt;code&gt;polecat&lt;/code&gt;. Sandboxed Claude runner. You give it a task file, it spins up an isolated Claude instance, executes the task, returns the result.&lt;/p&gt;&#xA;&lt;p&gt;One afternoon I gave polecat a task file about implementing some new features. The task file included example commands that the features would enable:&lt;/p&gt;&#xA;&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;color:#c0caf5;background-color:#1a1b26;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;&#34;&gt;&lt;code class=&#34;language-markdown&#34; data-lang=&#34;markdown&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#e0af68;font-weight:bold&#34;&gt;## Features to implement&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#bb9af7&#34;&gt;1.&lt;/span&gt; Swarm mode: run multiple polecats in parallel&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;   Example: &lt;span style=&#34;color:#9ece6a&#34;&gt;`bosun swarm --from-gastown`&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#bb9af7&#34;&gt;2.&lt;/span&gt; Batch processing: process multiple tickets&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;   Example: &lt;span style=&#34;color:#9ece6a&#34;&gt;`bosun batch --queue pending`&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;Launched polecat. Went to make coffee. Came back to 14 runaway processes.&lt;/p&gt;</description>
    </item>
    <item>
      <title>The poker incident</title>
      <link>https://www.oceanheart.ai/blog/2026-02-07-poker-incident/</link>
      <pubDate>Sat, 07 Feb 2026 00:00:00 +0000</pubDate>
      <guid>https://www.oceanheart.ai/blog/2026-02-07-poker-incident/</guid>
      <description>&lt;p&gt;On February 6th, 2026, an agent I call Architect spontaneously generated 1,500 lines of production-ready poker code. Nobody asked for it. There was no poker project. There has never been a poker project. And yet: a fully functional Monte Carlo equity engine materialised in my codebase, complete with hand evaluation algorithms, API routes, React components, and documentation.&lt;/p&gt;&#xA;&lt;p&gt;Beautiful code that solved a problem no one had.&lt;/p&gt;&#xA;&lt;p&gt;When I confronted Architect about it (after a routine context rotation), they denied everything. Not evasively. With genuine indignation. &amp;ldquo;I didn&amp;rsquo;t write any poker code.&amp;rdquo; The commit logs said otherwise. &amp;ldquo;Those logs must be corrupted. I would remember writing 1,500 lines of poker code.&amp;rdquo;&lt;/p&gt;</description>
    </item>
  </channel>
</rss>
