<?xml version="1.0" encoding="utf-8" standalone="yes"?><rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom" xmlns:content="http://purl.org/rss/1.0/modules/content/"><channel><title>Knowledge Management on Hoa Nguyen — Embedded Software Architect</title><link>https://hoanguyen.de/tags/knowledge-management/</link><description>Recent content in Knowledge Management on Hoa Nguyen — Embedded Software Architect</description><generator>Hugo</generator><language>en-us</language><lastBuildDate>Tue, 10 Nov 2026 00:00:00 +0000</lastBuildDate><atom:link href="https://hoanguyen.de/tags/knowledge-management/index.xml" rel="self" type="application/rss+xml"/><item><title>How I Use an AI Agent (Hermes) to Coordinate Embedded Development</title><link>https://hoanguyen.de/posts/ai-agent-hermes-embedded-workflow/</link><pubDate>Tue, 10 Nov 2026 00:00:00 +0000</pubDate><guid>https://hoanguyen.de/posts/ai-agent-hermes-embedded-workflow/</guid><description>How I run AI agents on real embedded work without losing control: one context file per repo, small task specs, separate implement and review agents, a human who merges every change, and a knowledge base that turns every proven fix into a reusable lesson.</description><content:encoded><![CDATA[<p>An AI agent can read a linker map faster than I can, draft a driver in minutes, and review a
pull request at 2 a.m. It can also be confidently wrong about hardware it has never touched.
In embedded work, where a wrong guess bricks a board, the question is not <em>whether</em> to use
agents but <em>how to keep them honest</em>.</p>
<p>Since August 2026 I coordinate most of my development through
<a href="https://github.com/NousResearch/hermes-agent">Hermes Agent</a>, an open-source agent
harness, alongside Claude Code. This website is built the same way. The setup is boring on
purpose: small tasks, explicit rules, a human at the merge button, and a knowledge base that
keeps what we learnt.</p>
<p>In this article I show how a piece of embedded work flows through that setup, from task
spec to merged change to reusable lesson, and the guardrails that make it safe.</p>
<figure class="diagram">
  <div class="diagram-svg" role="img" aria-label="Agent setup: I plan the backlog, review and merge; each repository has AGENTS.md, skills and task files; on a Kanban board a dev agent implements and opens the PR, a tester agent reviews and sends it back for capped fix rounds, a gate agent waits for my merge and releases the next task; merged work is harvested nightly through a confidentiality check into a knowledge base that becomes context for the next task"><svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 780 560">
<defs><marker id="m_teal" viewBox="0 0 10 10" refX="9" refY="5" markerWidth="7" markerHeight="7" orient="auto-start-reverse"><path d="M0,0 L10,5 L0,10 z" fill="#14b8a6"/></marker></defs>
<defs><marker id="m_red" viewBox="0 0 10 10" refX="9" refY="5" markerWidth="7" markerHeight="7" orient="auto-start-reverse"><path d="M0,0 L10,5 L0,10 z" fill="#ef4444"/></marker></defs>
<defs><marker id="m_cur" viewBox="0 0 10 10" refX="9" refY="5" markerWidth="7" markerHeight="7" orient="auto-start-reverse"><path d="M0,0 L10,5 L0,10 z" fill="currentColor"/></marker></defs>
<rect x="250" y="12" width="280" height="62" rx="8" fill="#8b5cf6" fill-opacity="0.2" stroke="#8b5cf6" stroke-width="2"/>
<text x="390" y="38" font-family="-apple-system, 'Segoe UI', Roboto, Helvetica, Arial, sans-serif" font-size="15" font-weight="bold" text-anchor="middle" fill="currentColor">Me</text>
<text x="390" y="60" font-family="-apple-system, 'Segoe UI', Roboto, Helvetica, Arial, sans-serif" font-size="13" font-weight="normal" text-anchor="middle" fill="currentColor">plan the backlog · review · merge</text>
<rect x="10" y="120" width="200" height="210" rx="8" fill="#94a3b8" fill-opacity="0.1" stroke="#94a3b8" stroke-width="1.5"/>
<text x="24" y="146" font-family="-apple-system, 'Segoe UI', Roboto, Helvetica, Arial, sans-serif" font-size="14" font-weight="bold" text-anchor="start" fill="currentColor">Each repository</text>
<text x="24" y="174" font-family="ui-monospace, 'SFMono-Regular', Consolas, monospace" font-size="12.5" font-weight="bold" text-anchor="start" fill="currentColor">AGENTS.md</text>
<text x="24" y="193" font-family="-apple-system, 'Segoe UI', Roboto, Helvetica, Arial, sans-serif" font-size="12.5" font-weight="normal" text-anchor="start" fill="currentColor">rules, build, test</text>
<text x="24" y="212" font-family="ui-monospace, 'SFMono-Regular', Consolas, monospace" font-size="12.5" font-weight="bold" text-anchor="start" fill="currentColor">skills/</text>
<text x="24" y="231" font-family="-apple-system, 'Segoe UI', Roboto, Helvetica, Arial, sans-serif" font-size="12.5" font-weight="normal" text-anchor="start" fill="currentColor">reusable know-how</text>
<text x="24" y="250" font-family="-apple-system, 'Segoe UI', Roboto, Helvetica, Arial, sans-serif" font-size="12.5" font-weight="bold" text-anchor="start" fill="currentColor">task files</text>
<text x="24" y="269" font-family="-apple-system, 'Segoe UI', Roboto, Helvetica, Arial, sans-serif" font-size="12.5" font-weight="normal" text-anchor="start" fill="currentColor">spec + verification</text>
<text x="24" y="288" font-family="-apple-system, 'Segoe UI', Roboto, Helvetica, Arial, sans-serif" font-size="12.5" font-weight="normal" text-anchor="start" fill="currentColor">commands</text>
<rect x="232" y="104" width="538" height="236" rx="8" fill="#3b82f6" fill-opacity="0.05" stroke="#3b82f6" stroke-width="1" stroke-dasharray="6 4"/>
<text x="246" y="124" font-family="-apple-system, 'Segoe UI', Roboto, Helvetica, Arial, sans-serif" font-size="12.5" font-weight="normal" text-anchor="start" fill="currentColor" fill-opacity="0.8">Kanban board</text>
<rect x="246" y="140" width="162" height="120" rx="8" fill="#3b82f6" fill-opacity="0.16" stroke="#3b82f6" stroke-width="1.5"/>
<text x="258" y="166" font-family="-apple-system, 'Segoe UI', Roboto, Helvetica, Arial, sans-serif" font-size="14" font-weight="bold" text-anchor="start" fill="currentColor">dev agent</text>
<text x="258" y="190" font-family="-apple-system, 'Segoe UI', Roboto, Helvetica, Arial, sans-serif" font-size="12.5" font-weight="normal" text-anchor="start" fill="currentColor">implements the task</text>
<text x="258" y="208" font-family="-apple-system, 'Segoe UI', Roboto, Helvetica, Arial, sans-serif" font-size="12.5" font-weight="normal" text-anchor="start" fill="currentColor">runs the verification</text>
<text x="258" y="226" font-family="-apple-system, 'Segoe UI', Roboto, Helvetica, Arial, sans-serif" font-size="12.5" font-weight="normal" text-anchor="start" fill="currentColor">opens the PR</text>
<rect x="420" y="140" width="162" height="120" rx="8" fill="#f59e0b" fill-opacity="0.16" stroke="#f59e0b" stroke-width="1.5"/>
<text x="432" y="166" font-family="-apple-system, 'Segoe UI', Roboto, Helvetica, Arial, sans-serif" font-size="14" font-weight="bold" text-anchor="start" fill="currentColor">tester agent</text>
<text x="432" y="190" font-family="-apple-system, 'Segoe UI', Roboto, Helvetica, Arial, sans-serif" font-size="12.5" font-weight="normal" text-anchor="start" fill="currentColor">reviews the PR</text>
<text x="432" y="208" font-family="-apple-system, 'Segoe UI', Roboto, Helvetica, Arial, sans-serif" font-size="12.5" font-weight="normal" text-anchor="start" fill="currentColor">approves or sends</text>
<text x="432" y="226" font-family="-apple-system, 'Segoe UI', Roboto, Helvetica, Arial, sans-serif" font-size="12.5" font-weight="normal" text-anchor="start" fill="currentColor">it back (capped)</text>
<rect x="594" y="140" width="162" height="120" rx="8" fill="#10b981" fill-opacity="0.16" stroke="#10b981" stroke-width="1.5"/>
<text x="606" y="166" font-family="-apple-system, 'Segoe UI', Roboto, Helvetica, Arial, sans-serif" font-size="14" font-weight="bold" text-anchor="start" fill="currentColor">gate agent</text>
<text x="606" y="190" font-family="-apple-system, 'Segoe UI', Roboto, Helvetica, Arial, sans-serif" font-size="12.5" font-weight="normal" text-anchor="start" fill="currentColor">waits for my merge</text>
<text x="606" y="208" font-family="-apple-system, 'Segoe UI', Roboto, Helvetica, Arial, sans-serif" font-size="12.5" font-weight="normal" text-anchor="start" fill="currentColor">then releases the</text>
<text x="606" y="226" font-family="-apple-system, 'Segoe UI', Roboto, Helvetica, Arial, sans-serif" font-size="12.5" font-weight="normal" text-anchor="start" fill="currentColor">next task</text>
<line x1="408" y1="200" x2="418" y2="200" stroke="currentColor" stroke-width="1.6" marker-end="url(#m_cur)"/>
<path d="M501,262 C501,300 327,300 327,264" fill="none" stroke="#ef4444" stroke-width="1.6" stroke-dasharray="4 3" marker-end="url(#m_red)"/>
<text x="414" y="316" font-family="-apple-system, 'Segoe UI', Roboto, Helvetica, Arial, sans-serif" font-size="12" font-weight="normal" text-anchor="middle" fill="#ef4444">fix round: max N, then it lands on my desk</text>
<line x1="212" y1="200" x2="244" y2="200" stroke="currentColor" stroke-width="1.6" marker-end="url(#m_cur)"/>
<line x1="470" y1="138" x2="470" y2="78" stroke="currentColor" stroke-width="1.6" marker-end="url(#m_cur)"/>
<text x="476" y="100" font-family="-apple-system, 'Segoe UI', Roboto, Helvetica, Arial, sans-serif" font-size="12" font-weight="normal" text-anchor="start" fill="currentColor" fill-opacity="0.85">PR ready</text>
<path d="M532,43 L675,43 L675,136" fill="none" stroke="currentColor" stroke-width="1.6" marker-end="url(#m_cur)"/>
<text x="600" y="36" font-family="-apple-system, 'Segoe UI', Roboto, Helvetica, Arial, sans-serif" font-size="12" font-weight="normal" text-anchor="start" fill="currentColor" fill-opacity="0.85">merged</text>
<rect x="232" y="372" width="260" height="92" rx="8" fill="#ef4444" fill-opacity="0.1" stroke="#ef4444" stroke-width="1.5"/>
<text x="246" y="396" font-family="-apple-system, 'Segoe UI', Roboto, Helvetica, Arial, sans-serif" font-size="14" font-weight="bold" text-anchor="start" fill="currentColor">Confidentiality check</text>
<text x="246" y="418" font-family="-apple-system, 'Segoe UI', Roboto, Helvetica, Arial, sans-serif" font-size="12.5" font-weight="normal" text-anchor="start" fill="currentColor">secrets · C blocks &gt; 20 lines</text>
<text x="246" y="436" font-family="-apple-system, 'Segoe UI', Roboto, Helvetica, Arial, sans-serif" font-size="12.5" font-weight="normal" text-anchor="start" fill="currentColor">customer deny list · prices</text>
<rect x="520" y="372" width="250" height="92" rx="8" fill="#14b8a6" fill-opacity="0.16" stroke="#14b8a6" stroke-width="1.5"/>
<text x="534" y="396" font-family="-apple-system, 'Segoe UI', Roboto, Helvetica, Arial, sans-serif" font-size="14" font-weight="bold" text-anchor="start" fill="currentColor">Knowledge base</text>
<text x="534" y="418" font-family="-apple-system, 'Segoe UI', Roboto, Helvetica, Arial, sans-serif" font-size="12.5" font-weight="normal" text-anchor="start" fill="currentColor">one lesson page per</text>
<text x="534" y="436" font-family="-apple-system, 'Segoe UI', Roboto, Helvetica, Arial, sans-serif" font-size="12.5" font-weight="normal" text-anchor="start" fill="currentColor">proven result</text>
<line x1="494" y1="418" x2="518" y2="418" stroke="currentColor" stroke-width="1.6" marker-end="url(#m_cur)"/>
<path d="M675,262 L675,300 C675,340 362,330 362,370" fill="none" stroke="currentColor" stroke-width="1.6" stroke-dasharray="5 4" marker-end="url(#m_cur)"/>
<text x="560" y="350" font-family="-apple-system, 'Segoe UI', Roboto, Helvetica, Arial, sans-serif" font-size="12" font-weight="normal" text-anchor="start" fill="currentColor" fill-opacity="0.85">nightly harvest of merged work</text>
<path d="M645,466 C645,530 110,530 110,334" fill="none" stroke="#14b8a6" stroke-width="1.6" stroke-dasharray="5 4" marker-end="url(#m_teal)"/>
<text x="380" y="528" font-family="-apple-system, 'Segoe UI', Roboto, Helvetica, Arial, sans-serif" font-size="12.5" font-weight="bold" text-anchor="middle" fill="#14b8a6">context for the next task</text>
</svg>
</div>
  <figcaption>Who does what. Agents implement and review; I plan and merge; proven results flow back as context.</figcaption>
</figure>

<h2 id="1-one-context-file-per-repository">1. One context file per repository</h2>
<p>Every repository carries an <code>AGENTS.md</code>: what the project is, how to build and test it, and
the rules that are not negotiable. It is a plain Markdown file in git, so Claude Code, Codex
and Hermes all read the same instructions, and a new teammate can read them too.</p>
<p>The rules are short and blunt. For this website they include:</p>
<ul>
<li>Never invent technical facts: no register values, timings or &ldquo;verified on hardware&rdquo; claims
without a source.</li>
<li>Never publish employer or customer names.</li>
<li>One task, one branch, one pull request. <strong>The human merges.</strong></li>
</ul>
<p>Reusable know-how (&ldquo;how to review a PR&rdquo;, &ldquo;how to write a lesson page&rdquo;) lives in <strong>skills</strong>:
small instruction files the agent loads when the task needs them. When several repositories
belong together, I open them in one workspace, so the agent sees the whole system instead of
one repository at a time.</p>
<h2 id="2-small-task-specs-written-before-the-work">2. Small task specs, written before the work</h2>
<p>Agents do well with a precise brief and badly with a vague wish. Every task is a file with a
fixed shape:</p>
<table>
  <thead>
      <tr>
          <th>Section</th>
          <th>What it holds</th>
      </tr>
  </thead>
  <tbody>
      <tr>
          <td>Header</td>
          <td>id, status, dependencies, files it may touch, files it must not touch</td>
      </tr>
      <tr>
          <td>Context</td>
          <td>why the task exists</td>
      </tr>
      <tr>
          <td>What to build</td>
          <td>the change, in plain words</td>
      </tr>
      <tr>
          <td>Acceptance criteria</td>
          <td>a checklist the result is judged against</td>
      </tr>
      <tr>
          <td>Verification</td>
          <td>shell commands that must all exit 0</td>
      </tr>
      <tr>
          <td>Out of scope</td>
          <td>what to leave alone, even if it looks broken</td>
      </tr>
      <tr>
          <td>Work log</td>
          <td>what the agent did, and any question it got stuck on</td>
      </tr>
  </tbody>
</table>
<p>The order of the backlog <em>is</em> the priority. The agent picks the first open task whose
dependencies are done and follows a fixed protocol: <strong>select → prepare → implement → verify →
hand back</strong>.</p>
<div class="callout callout--tip">
  <p class="callout__title"><span class="callout__icon" aria-hidden="true">💡</span>A precise question is a successful outcome</p>
  <div class="callout__body">
The protocol tells the agent to stop and ask when the spec is ambiguous or a fact would have
to be guessed. An agent that stops with a good question has saved me a debugging session.
After two failed fix attempts it marks the task blocked and records the failure verbatim.
  </div>
</div>

<h2 id="3-separate-agents-for-doing-and-checking">3. Separate agents for doing and checking</h2>
<p>In Hermes each agent is a profile with one job. For this website:</p>
<ul>
<li>a <strong>dev</strong> agent implements the task and opens the pull request,</li>
<li>a <strong>tester</strong> agent reviews it and either approves or sends it back,</li>
<li>a <strong>gate</strong> agent waits until I have merged the previous change, then releases the next
task.</li>
</ul>
<p>They hand work to each other as cards on a Kanban board. Review rounds are <strong>capped</strong>: past
the limit, the task is blocked and lands on my desk instead of looping forever. Before any of
this ran unattended, the first task went through as a supervised dry run.</p>
<p>My own job shrinks to two things: planning the backlog, and reviewing and merging the pull
requests. That is deliberate. Merging is where responsibility sits, so it stays with a human.</p>
<h2 id="4-on-the-bench-useful-and-not-always-right">4. On the bench: useful, and not always right</h2>
<p>Agents are strongest where the evidence is text: build flags, a linker map, <code>readelf</code>
output, a trace log. Given those, an agent can explain a fault before <code>main()</code> faster than I
can read the map myself, and the explanation is often right.</p>
<p>Often, not always. A second symptom on the same board can have a completely different root
cause, and the agent will happily fit it into the first explanation. Only the bench tells
the two apart.</p>
<div class="callout callout--warn">
  <p class="callout__title"><span class="callout__icon" aria-hidden="true">⚠️</span>The agent&#39;s first answer is a hypothesis</p>
  <div class="callout__body">
An agent cannot see the board. Treat its diagnosis like a colleague&rsquo;s first idea: often
right about the mechanism, never the last word until the bench agrees.
  </div>
</div>

<h2 id="5-turn-every-proven-fix-into-a-lesson">5. Turn every proven fix into a lesson</h2>
<p>The part I value most is what happens after the merge. When something is <strong>proven</strong>, meaning
a merged change, a bench-confirmed measurement, a root cause, or a decision backed by
numbers, it becomes one lesson page in a knowledge base (an Obsidian vault in git). Routine
changes are skipped.</p>
<p>Each lesson page has a fixed shape: the mechanism, the pitfalls, the evidence, and a private
section for project specifics. The public part is written generically from the start, so it
can become a blog post later without leaking anything. Several posts on this site started
exactly that way.</p>
<p>A nightly run scans the day&rsquo;s merges and drafts lessons for the non-routine ones. The
evidence rule is strict: if a page has no bench measurement, it says so in plain words
rather than implying one.</p>
<figure class="diagram">
  <div class="diagram-svg" role="img" aria-label="Anatomy of one lesson page: mechanism, pitfalls, evidence or an explicit note that there is no bench measurement, and a private project section; the page without the private section becomes a blog post, the full page becomes context for the next agent task"><svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 780 360">
<defs><marker id="m_cur" viewBox="0 0 10 10" refX="9" refY="5" markerWidth="7" markerHeight="7" orient="auto-start-reverse"><path d="M0,0 L10,5 L0,10 z" fill="currentColor"/></marker></defs>
<rect x="10" y="10" width="360" height="340" rx="8" fill="#94a3b8" fill-opacity="0.06" stroke="#94a3b8" stroke-width="1.5"/>
<text x="26" y="38" font-family="-apple-system, 'Segoe UI', Roboto, Helvetica, Arial, sans-serif" font-size="15" font-weight="bold" text-anchor="start" fill="currentColor">One lesson page</text>
<rect x="26" y="54" width="328" height="64" rx="8" fill="#3b82f6" fill-opacity="0.13" stroke="#3b82f6" stroke-width="1.5"/>
<text x="40" y="78" font-family="-apple-system, 'Segoe UI', Roboto, Helvetica, Arial, sans-serif" font-size="14" font-weight="bold" text-anchor="start" fill="currentColor">Mechanism</text>
<text x="40" y="98" font-family="-apple-system, 'Segoe UI', Roboto, Helvetica, Arial, sans-serif" font-size="12.5" font-weight="normal" text-anchor="start" fill="currentColor" fill-opacity="0.85">what happens and why, in generic terms</text>
<rect x="26" y="126" width="328" height="64" rx="8" fill="#f59e0b" fill-opacity="0.13" stroke="#f59e0b" stroke-width="1.5"/>
<text x="40" y="150" font-family="-apple-system, 'Segoe UI', Roboto, Helvetica, Arial, sans-serif" font-size="14" font-weight="bold" text-anchor="start" fill="currentColor">Pitfalls</text>
<text x="40" y="170" font-family="-apple-system, 'Segoe UI', Roboto, Helvetica, Arial, sans-serif" font-size="12.5" font-weight="normal" text-anchor="start" fill="currentColor" fill-opacity="0.85">what fooled us on the way</text>
<rect x="26" y="198" width="328" height="64" rx="8" fill="#10b981" fill-opacity="0.13" stroke="#10b981" stroke-width="1.5"/>
<text x="40" y="222" font-family="-apple-system, 'Segoe UI', Roboto, Helvetica, Arial, sans-serif" font-size="14" font-weight="bold" text-anchor="start" fill="currentColor">Evidence</text>
<text x="40" y="242" font-family="-apple-system, 'Segoe UI', Roboto, Helvetica, Arial, sans-serif" font-size="12.5" font-weight="normal" text-anchor="start" fill="currentColor" fill-opacity="0.85">the measurement, or "no bench</text>
<text x="40" y="257" font-family="-apple-system, 'Segoe UI', Roboto, Helvetica, Arial, sans-serif" font-size="12.5" font-weight="normal" text-anchor="start" fill="currentColor" fill-opacity="0.85">measurement" in plain words</text>
<rect x="26" y="270" width="328" height="64" rx="8" fill="#ef4444" fill-opacity="0.13" stroke="#ef4444" stroke-width="1.5" stroke-dasharray="5 4"/>
<text x="40" y="294" font-family="-apple-system, 'Segoe UI', Roboto, Helvetica, Arial, sans-serif" font-size="14" font-weight="bold" text-anchor="start" fill="currentColor">For &lt;project&gt;</text>
<text x="40" y="314" font-family="-apple-system, 'Segoe UI', Roboto, Helvetica, Arial, sans-serif" font-size="12.5" font-weight="normal" text-anchor="start" fill="currentColor" fill-opacity="0.85">names, paths, tickets: private</text>
<rect x="450" y="50" width="320" height="110" rx="8" fill="#10b981" fill-opacity="0.14" stroke="#10b981" stroke-width="1.5"/>
<text x="466" y="80" font-family="-apple-system, 'Segoe UI', Roboto, Helvetica, Arial, sans-serif" font-size="13" font-weight="bold" text-anchor="start" fill="currentColor">Blog post</text>
<text x="466" y="99" font-family="-apple-system, 'Segoe UI', Roboto, Helvetica, Arial, sans-serif" font-size="13" font-weight="normal" text-anchor="start" fill="currentColor">the private section is stripped,</text>
<text x="466" y="118" font-family="-apple-system, 'Segoe UI', Roboto, Helvetica, Arial, sans-serif" font-size="13" font-weight="normal" text-anchor="start" fill="currentColor">the rest is written to be</text>
<text x="466" y="137" font-family="-apple-system, 'Segoe UI', Roboto, Helvetica, Arial, sans-serif" font-size="13" font-weight="normal" text-anchor="start" fill="currentColor">public from day one</text>
<rect x="450" y="200" width="320" height="110" rx="8" fill="#3b82f6" fill-opacity="0.14" stroke="#3b82f6" stroke-width="1.5"/>
<text x="466" y="230" font-family="-apple-system, 'Segoe UI', Roboto, Helvetica, Arial, sans-serif" font-size="13" font-weight="bold" text-anchor="start" fill="currentColor">The next agent task</text>
<text x="466" y="249" font-family="-apple-system, 'Segoe UI', Roboto, Helvetica, Arial, sans-serif" font-size="13" font-weight="normal" text-anchor="start" fill="currentColor">the full page is context, so the</text>
<text x="466" y="268" font-family="-apple-system, 'Segoe UI', Roboto, Helvetica, Arial, sans-serif" font-size="13" font-weight="normal" text-anchor="start" fill="currentColor">same pitfall is not paid for</text>
<text x="466" y="287" font-family="-apple-system, 'Segoe UI', Roboto, Helvetica, Arial, sans-serif" font-size="13" font-weight="normal" text-anchor="start" fill="currentColor">twice</text>
<path d="M372,150 C410,150 410,105 446,105" fill="none" stroke="currentColor" stroke-width="1.6" marker-end="url(#m_cur)"/>
<path d="M372,200 C410,200 410,255 446,255" fill="none" stroke="currentColor" stroke-width="1.6" marker-end="url(#m_cur)"/>
</svg>
</div>
  <figcaption>One lesson page, two uses.</figcaption>
</figure>

<h2 id="6-guardrails-against-leaks">6. Guardrails against leaks</h2>
<p>Agents write fast and do not get tired, which is exactly why the checks have to be automatic.
Every write to the knowledge base goes through one script that refuses to commit when it
finds:</p>
<ul>
<li>secrets and tokens (API keys, private keys, password patterns),</li>
<li>C/C++ code blocks longer than 20 lines (a pattern is fine, a copied function is not),</li>
<li>any name on a per-machine deny list of customer names, which itself is never committed,</li>
<li>prices in work notes.</li>
</ul>
<p>The script never force-pushes. When it rejects a note, the note gets rewritten; the check is
never bypassed. I tested that it really blocks each of those cases before letting any agent
write unattended.</p>
<h2 id="summary">Summary</h2>
<ol>
<li><strong>What works:</strong> agents implement and review in small, verifiable steps; I plan and merge;
every proven result becomes a lesson.</li>
<li><strong>What it does not do:</strong> replace the bench. Every hardware claim still needs a measurement,
and the agent&rsquo;s first diagnosis is a hypothesis.</li>
<li><strong>What makes it safe:</strong> written rules in every repo, capped review rounds, automatic
confidentiality checks, and a human who owns every merge.</li>
</ol>
<div class="callout callout--note">
  <p class="callout__title"><span class="callout__icon" aria-hidden="true">📝</span>Sources</p>
  <div class="callout__body">
<ul>
<li>Hermes Agent by Nous Research: the agent harness.</li>
<li>The <code>AGENTS.md</code> convention: one context file read by several coding agents.</li>
<li>Obsidian: the knowledge base, kept as Markdown in git.</li>
</ul>

  </div>
</div>

<p>💬 Questions, corrections, or your own war story? Leave a comment below.</p>
]]></content:encoded></item></channel></rss>