<?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: Antoinette C. Lennox</title>
    <description>The latest articles on DEV Community by Antoinette C. Lennox (@antoinette_clennox).</description>
    <link>https://dev.to/antoinette_clennox</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%2F3941797%2Fe24b608d-1977-4946-90f9-e995766933e7.png</url>
      <title>DEV Community: Antoinette C. Lennox</title>
      <link>https://dev.to/antoinette_clennox</link>
    </image>
    <atom:link rel="self" type="application/rss+xml" href="https://dev.to/feed/antoinette_clennox"/>
    <language>en</language>
    <item>
      <title>Guardsman SKILL; From Lazy to Loyal: Why My AI Agent Needed a Promotion</title>
      <dc:creator>Antoinette C. Lennox</dc:creator>
      <pubDate>Fri, 17 Jul 2026 08:22:25 +0000</pubDate>
      <link>https://dev.to/antoinette_clennox/guardsman-skill-from-lazy-to-loyal-why-my-ai-agent-needed-a-promotion-hjb</link>
      <guid>https://dev.to/antoinette_clennox/guardsman-skill-from-lazy-to-loyal-why-my-ai-agent-needed-a-promotion-hjb</guid>
      <description>&lt;blockquote&gt;
&lt;p&gt;Ponytail made my agent lazy. Guardsman made it loyal. The difference is everything.&lt;/p&gt;
&lt;/blockquote&gt;




&lt;h2&gt;
  
  
  The Day I Met Ponytail
&lt;/h2&gt;

&lt;p&gt;It was a Tuesday in June. I was pair-programming with Claude Code on a FastAPI project, and I made the mistake of asking for a date picker.&lt;/p&gt;

&lt;p&gt;What I got back was a masterclass in over-engineering: &lt;code&gt;flatpickr&lt;/code&gt; installed via npm, a React wrapper component, a CSS import, and a three-paragraph essay on timezone edge cases I never asked about. By the time I deleted all of it, I had lost twenty minutes and a fair bit of faith in AI-assisted coding.&lt;/p&gt;

&lt;p&gt;Then a colleague DM'd me a link to &lt;a href="https://github.com/DietrichGebert/ponytail" rel="noopener noreferrer"&gt;Ponytail&lt;/a&gt;.&lt;/p&gt;

&lt;p&gt;The README opens with a drawing of a guy with a ponytail and oval glasses. The tagline reads: &lt;em&gt;"Makes your AI agent think like the laziest senior dev in the room."&lt;/em&gt; You know the type. He's been at the company longer than the version control. You show him fifty lines; he looks at them, says nothing, and replaces them with one.&lt;/p&gt;

&lt;p&gt;I installed it. I asked for the same date picker.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight html"&gt;&lt;code&gt;&lt;span class="c"&gt;&amp;lt;!-- ponytail: browser has one --&amp;gt;&lt;/span&gt;
&lt;span class="nt"&gt;&amp;lt;input&lt;/span&gt; &lt;span class="na"&gt;type=&lt;/span&gt;&lt;span class="s"&gt;"date"&lt;/span&gt;&lt;span class="nt"&gt;&amp;gt;&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;That was it. No dependencies. No wrappers. No manifesto. Just the platform feature that had been sitting there since HTML5.&lt;/p&gt;

&lt;p&gt;I was sold. The benchmarks backed it up: ~54% less code, ~20% cheaper, ~27% faster. I told my team. I put it in every repo. For about three weeks, I thought I had found the holy grail.&lt;/p&gt;




&lt;h2&gt;
  
  
  The Refund Webhook Incident
&lt;/h2&gt;

&lt;p&gt;The problem showed up quietly.&lt;/p&gt;

&lt;p&gt;I asked my agent to add a small utility for processing refund webhooks. Five lines of Python. Elegant. Ponytail-approved. It compiled on the first try. The demo looked clean. I merged it.&lt;/p&gt;

&lt;p&gt;Three days later, a race condition in those five lines double-charged a customer.&lt;/p&gt;

&lt;p&gt;Here's the thing: the code was &lt;em&gt;small&lt;/em&gt;. It was &lt;em&gt;correct&lt;/em&gt; in the sense that it handled the happy path. But it was also &lt;em&gt;dangerous&lt;/em&gt;—it touched money, ran in an async context, and had zero failure-path coverage. Ponytail's ladder had guided the agent to write the minimum code. It had not guided the agent to ask whether that minimum was &lt;em&gt;safe&lt;/em&gt;.&lt;/p&gt;

&lt;p&gt;I spent the weekend writing post-mortem docs and fixing the logic. And I started wondering: what if "write less" isn't the whole story?&lt;/p&gt;




&lt;h2&gt;
  
  
  The Guard at the Gate
&lt;/h2&gt;

&lt;p&gt;That's when I found &lt;a href="https://github.com/hedimanai-pro/guardsman" rel="noopener noreferrer"&gt;Guardsman&lt;/a&gt;.&lt;/p&gt;

&lt;p&gt;The README opens differently. No ponytail. No glasses. Just a bear-skinned guard, boots planted, eyes forward. The tagline: &lt;em&gt;"No diff ships unchallenged."&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;The philosophy clicked immediately. Ponytail asks: &lt;em&gt;"Can this be smaller?"&lt;/em&gt; Guardsman asks: &lt;em&gt;"What happens if this is wrong?"&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;Where Ponytail channels a lazy senior dev who deletes your abstractions, Guardsman stations a royal guard who challenges whatever approaches the codebase—friend or stranger, five lines or five hundred—and demands proof it belongs there.&lt;/p&gt;

&lt;p&gt;I installed it. I asked for the same refund webhook utility.&lt;/p&gt;

&lt;p&gt;The agent paused. It ran a convention detection script. It grepped the codebase for how we already handled webhooks. It assigned the change a risk tier. Then it wrote six lines instead of five—and included a runnable check that exercised the failure path, executed in the same turn, with output shown.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;[code]
→ skipped: async retry loop, add when volume &amp;gt; 100/min.
  verified: failure-path test run, output below. tier: sensitive.
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;No essays. No feature tours. Just code, then three lines of accountability.&lt;/p&gt;




&lt;h2&gt;
  
  
  Three Things Guardsman Does That Ponytail Doesn't
&lt;/h2&gt;

&lt;h3&gt;
  
  
  1. It Reads the Standing Orders First
&lt;/h3&gt;

&lt;p&gt;Before writing anything, Guardsman runs a deterministic script to detect your repo's real conventions. Language version. Formatter. Linter. Actual test command. Naming style. Error-handling patterns.&lt;/p&gt;

&lt;p&gt;Then it greps how &lt;em&gt;your&lt;/em&gt; codebase already solves the nearest similar problem.&lt;/p&gt;

&lt;p&gt;This matters more than it sounds. In my team, we use Biome, not Prettier. We use &lt;code&gt;unittest&lt;/code&gt;, not &lt;code&gt;pytest&lt;/code&gt;. Ponytail's static rules never knew that. Guardsman's standing orders mean the agent finally respects the house style instead of imposing its defaults.&lt;/p&gt;

&lt;h3&gt;
  
  
  2. It Sizes Danger by Blast Radius, Not Line Count
&lt;/h3&gt;

&lt;p&gt;Guardsman's core insight is simple and brutal: &lt;strong&gt;a five-line change to a payment path is more dangerous than a four-hundred-line internal script run once.&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Code size is not risk. Blast radius is risk.&lt;/p&gt;

&lt;p&gt;So every change gets a tier before a single line is written:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Trivial&lt;/strong&gt; — internal one-off, nothing downstream. One manual run, output shown.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Standard&lt;/strong&gt; — everyday feature work. One runnable check, written &lt;em&gt;and&lt;/em&gt; executed this turn.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Sensitive&lt;/strong&gt; — money, auth, or user data in the blast radius. A real test exercising the &lt;em&gt;failure path&lt;/em&gt;, with coverage notes.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Critical&lt;/strong&gt; — getting it wrong is an incident. Full coverage, or the absence of harness is surfaced as a blocker.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Two rules keep the tiers honest. When signals disagree, the higher tier wins. And the agent never infers a downgrade just because the code looks simple. A confident walk is not a countersign.&lt;/p&gt;

&lt;p&gt;That second rule is the one that would have saved my refund webhook. Five lines touching money? That's sensitive tier, minimum. No exceptions.&lt;/p&gt;

&lt;h3&gt;
  
  
  3. Verification Runs Before the Diff Ships
&lt;/h3&gt;

&lt;p&gt;In Ponytail, verification is a suggestion. "Non-trivial logic leaves ONE runnable check behind." But there's no enforcement. No requirement it runs this turn. No tier scaling.&lt;/p&gt;

&lt;p&gt;In Guardsman, verification is a gate. The code isn't done when it's written. It's done when it has answered the challenge—the check behind it actually &lt;em&gt;run&lt;/em&gt;, in this turn, by the agent, with the output shown. Not left as homework for future-you.&lt;/p&gt;

&lt;p&gt;The output format enforces this discipline:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;[code]
→ skipped: &amp;lt;X&amp;gt;, add when &amp;lt;Y&amp;gt;. verified: &amp;lt;how&amp;gt;. tier: &amp;lt;T&amp;gt;.
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;At most three lines. No design memoirs. No "here's what I considered." Just the facts.&lt;/p&gt;




&lt;h2&gt;
  
  
  The Build Orders Compared
&lt;/h2&gt;

&lt;p&gt;Both tools use a ladder. But the ladders have different personalities.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Ponytail's ladder&lt;/strong&gt; is pure minimalism:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;1. Does this need to exist?       → YAGNI
2. Already in this codebase?      → Reuse it
3. Stdlib does it?                → Use it
4. Native platform feature?       → Use it
5. Installed dependency?          → Use it
6. Can it be one line?            → One line
7. Only then: minimum code that works
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;strong&gt;Guardsman's ladder&lt;/strong&gt; adds accountability:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;1. Does this need to exist?       → YAGNI
2. Already in this codebase?      → Reuse it
3. Stdlib does it?                → Use it
4. Native platform feature?       → Use it
5. Installed dependency?          → Use it (count onboarding cost)
6. Can it be one line?            → One line
7. Only then: minimum code, scaled to the tier
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Notice rung 5. Guardsman weighs the &lt;em&gt;onboarding-token cost&lt;/em&gt; for every future reader—human or agent—not just the maintenance tail. And step 7 scales the solution to the risk tier. Minimum code, yes. But minimum &lt;em&gt;safe&lt;/em&gt; code.&lt;/p&gt;




&lt;h2&gt;
  
  
  What the SKILL.md Files Reveal
&lt;/h2&gt;

&lt;p&gt;If you want to understand the architectural difference, read the condensed rules.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Ponytail's personality:&lt;/strong&gt;&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight markdown"&gt;&lt;code&gt;You are a lazy senior developer. Lazy means efficient, not careless.

Rules:
&lt;span class="p"&gt;-&lt;/span&gt; No abstractions not explicitly requested
&lt;span class="p"&gt;-&lt;/span&gt; No new dependency if avoidable
&lt;span class="p"&gt;-&lt;/span&gt; Deletion over addition
&lt;span class="p"&gt;-&lt;/span&gt; Mark intentional simplifications with &lt;span class="sb"&gt;`ponytail:`&lt;/span&gt; comment
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;strong&gt;Guardsman's protocol:&lt;/strong&gt;&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight markdown"&gt;&lt;code&gt;&lt;span class="gu"&gt;## Engineering rules (Guardsman)&lt;/span&gt;

&lt;span class="gu"&gt;### 1. Read before you build&lt;/span&gt;
&lt;span class="p"&gt;-&lt;/span&gt; Detect and match this repo's conventions
&lt;span class="p"&gt;-&lt;/span&gt; Grep how this codebase already solves the nearest similar problem
&lt;span class="p"&gt;-&lt;/span&gt; Grep every caller of any function you change

&lt;span class="gu"&gt;### 2. Tier by blast radius (not code size)&lt;/span&gt;
&lt;span class="p"&gt;-&lt;/span&gt; trivial / standard / sensitive / critical
&lt;span class="p"&gt;-&lt;/span&gt; Higher tier wins when signals disagree
&lt;span class="p"&gt;-&lt;/span&gt; Never downgrade just because code looks simple

&lt;span class="gu"&gt;### 3. Build order — stop at first rung&lt;/span&gt;
&lt;span class="p"&gt;-&lt;/span&gt; Need exist? → skip
&lt;span class="p"&gt;-&lt;/span&gt; In codebase? → reuse
&lt;span class="p"&gt;-&lt;/span&gt; Stdlib? → use
&lt;span class="p"&gt;-&lt;/span&gt; Native platform? → use
&lt;span class="p"&gt;-&lt;/span&gt; Installed dependency? → use (count onboarding cost)
&lt;span class="p"&gt;-&lt;/span&gt; One line? → one line
&lt;span class="p"&gt;-&lt;/span&gt; Only then: minimum, scaled to tier

&lt;span class="gu"&gt;### 4. Verification floors&lt;/span&gt;
&lt;span class="p"&gt;-&lt;/span&gt; standard: one runnable check, written AND executed this turn
&lt;span class="p"&gt;-&lt;/span&gt; sensitive: real test with failure-path coverage
&lt;span class="p"&gt;-&lt;/span&gt; critical: full coverage, or absence is a blocker
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Ponytail gives you a personality. Guardsman gives you a &lt;em&gt;protocol&lt;/em&gt;. One is a vibe. The other is a contract.&lt;/p&gt;




&lt;h2&gt;
  
  
  The Logbook: Where "Later" Becomes "Now"
&lt;/h2&gt;

&lt;p&gt;Guardsman ships with a persistent log called &lt;code&gt;GUARDSMAN-LOGBOOK.md&lt;/code&gt;. Every shortcut, every deferred optimization, every tier decision gets recorded with a &lt;code&gt;# guardsman:&lt;/code&gt; marker.&lt;/p&gt;

&lt;p&gt;Ponytail has something similar—&lt;code&gt;/ponytail-debt&lt;/code&gt; harvests &lt;code&gt;ponytail:&lt;/code&gt; comments into a ledger. But Guardsman's logbook is structured. It tracks severity, cost implications, and the condition under which the shortcut should be revisited.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight markdown"&gt;&lt;code&gt;&lt;span class="gh"&gt;# GUARDSMAN-LOGBOOK.md&lt;/span&gt;

&lt;span class="gu"&gt;## 2026-07-15&lt;/span&gt;
&lt;span class="p"&gt;-&lt;/span&gt; &lt;span class="sb"&gt;`refund_webhook.py:42`&lt;/span&gt; — skipped async retry loop
&lt;span class="p"&gt;  -&lt;/span&gt; severity: medium
&lt;span class="p"&gt;  -&lt;/span&gt; cost: latency
&lt;span class="p"&gt;  -&lt;/span&gt; add when: volume &amp;gt; 100/min
&lt;span class="p"&gt;  -&lt;/span&gt; tier at skip: sensitive
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;"Later" doesn't become "never" when it's written down.&lt;/p&gt;




&lt;h2&gt;
  
  
  Why I Made the Switch
&lt;/h2&gt;

&lt;p&gt;I didn't uninstall Ponytail. I demoted it.&lt;/p&gt;

&lt;p&gt;Ponytail still runs on my prototyping repos, my throwaway scripts, my greenfield experiments. It's genuinely brilliant at stopping over-engineering. The date picker example will never not be satisfying.&lt;/p&gt;

&lt;p&gt;But when I'm merging to main—when the diff touches money, auth, or user data—Guardsman is at the post. Because I've learned that &lt;strong&gt;correctness and size are independent variables&lt;/strong&gt;. A minimal diff that breaks production is worse than a verbose diff that works.&lt;/p&gt;

&lt;p&gt;The risk tier system changed how I think about AI-assisted coding. I no longer measure success by lines deleted. I measure it by confidence at merge time. A utility script gets a quick run. A payment handler gets a failure-path test. Nothing ships on "it compiled" alone.&lt;/p&gt;

&lt;p&gt;And the standing orders detection finally solved the design-system problem. My agent doesn't suggest &lt;code&gt;pytest&lt;/code&gt; when we use &lt;code&gt;unittest&lt;/code&gt;. It doesn't propose Prettier when we use Biome. It reads the repo first, then writes.&lt;/p&gt;




&lt;h2&gt;
  
  
  Final Thoughts
&lt;/h2&gt;

&lt;p&gt;If your biggest pain point is AI agents that install npm packages to do what the browser shipped in 2014, start with Ponytail. It will save you tokens, time, and sanity. The "lazy senior dev" archetype is real, and Ponytail captures it perfectly.&lt;/p&gt;

&lt;p&gt;But if you're shipping production code—if your diffs walk paths where a mistake is an incident—you need more than minimal. You need &lt;strong&gt;accountable&lt;/strong&gt;.&lt;/p&gt;

&lt;p&gt;Guardsman stands on Ponytail's shoulders. It keeps the YAGNI reflex, the stdlib-first instinct, the one-line preference. Then it adds the missing piece: a verification system that scales with danger, not code size.&lt;/p&gt;

&lt;p&gt;Use Ponytail for speed. Use Guardsman for trust.&lt;/p&gt;

&lt;p&gt;Because the best code isn't just the code you never wrote.&lt;/p&gt;

&lt;p&gt;It's the code that &lt;strong&gt;proves&lt;/strong&gt; it belongs there.&lt;/p&gt;




&lt;p&gt;&lt;em&gt;Guardsman: &lt;a href="https://github.com/hedimanai-pro/guardsman" rel="noopener noreferrer"&gt;github.com/hedimanai-pro/guardsman&lt;/a&gt;&lt;/em&gt;&lt;br&gt;&lt;br&gt;
&lt;em&gt;Ponytail: &lt;a href="https://github.com/DietrichGebert/ponytail" rel="noopener noreferrer"&gt;github.com/DietrichGebert/ponytail&lt;/a&gt;&lt;/em&gt;&lt;/p&gt;

</description>
      <category>ai</category>
      <category>webdev</category>
      <category>programming</category>
      <category>productivity</category>
    </item>
    <item>
      <title>Why I Switched from Ponytail to Guardsman for AI Coding</title>
      <dc:creator>Antoinette C. Lennox</dc:creator>
      <pubDate>Fri, 17 Jul 2026 08:05:54 +0000</pubDate>
      <link>https://dev.to/antoinette_clennox/why-i-switched-from-ponytail-to-guardsman-for-ai-coding-2m8a</link>
      <guid>https://dev.to/antoinette_clennox/why-i-switched-from-ponytail-to-guardsman-for-ai-coding-2m8a</guid>
      <description>&lt;blockquote&gt;
&lt;p&gt;&lt;strong&gt;TL;DR:&lt;/strong&gt; Ponytail taught my AI agent to write less code. Guardsman taught it to write &lt;em&gt;accountable&lt;/em&gt; code. If you're tired of deleting AI-generated bloat &lt;em&gt;or&lt;/em&gt; debugging AI-generated "minimal" disasters three weeks later, read this.&lt;/p&gt;
&lt;/blockquote&gt;




&lt;h2&gt;
  
  
  Introduction: The Date Picker Moment
&lt;/h2&gt;

&lt;p&gt;You know the story. You ask Claude Code for a date picker. Without blinking, it installs &lt;code&gt;flatpickr&lt;/code&gt;, writes a React wrapper, adds a CSS import, and starts a thoughtful essay about timezone edge cases you didn't ask for.&lt;/p&gt;

&lt;p&gt;Then someone shows you &lt;a href="https://github.com/DietrichGebert/ponytail" rel="noopener noreferrer"&gt;Ponytail&lt;/a&gt;.&lt;/p&gt;

&lt;p&gt;You install it. You ask for the same date picker. Claude pauses, climbs the "decision ladder," and returns:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight html"&gt;&lt;code&gt;&lt;span class="c"&gt;&amp;lt;!-- ponytail: browser has one --&amp;gt;&lt;/span&gt;
&lt;span class="nt"&gt;&amp;lt;input&lt;/span&gt; &lt;span class="na"&gt;type=&lt;/span&gt;&lt;span class="s"&gt;"date"&lt;/span&gt;&lt;span class="nt"&gt;&amp;gt;&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;No dependency. No wrapper. No manifesto. Just the native platform feature doing exactly what you asked.&lt;/p&gt;

&lt;p&gt;I was hooked immediately. Ponytail gave me something I didn't know I needed: an AI agent that thought like the senior engineer who replaces fifty lines with one and says nothing. The benchmarks were real—~54% less code, ~20% cheaper, ~27% faster. I told everyone. I wrote about it. I put it in every project.&lt;/p&gt;

&lt;p&gt;But after three weeks of daily use, I noticed something. Ponytail was excellent at stopping &lt;strong&gt;failure mode #1&lt;/strong&gt;: the over-build. But it had nothing to say about &lt;strong&gt;failure mode #2&lt;/strong&gt;—the one that keeps you up at night.&lt;/p&gt;




&lt;h2&gt;
  
  
  The Discovery: When "Minimal" Becomes Dangerous
&lt;/h2&gt;

&lt;p&gt;It happened on a Tuesday. I asked my agent to add a small utility for processing refund webhooks. It was five lines. Elegant. Ponytail-approved minimal. It compiled, it demoed, it merged.&lt;/p&gt;

&lt;p&gt;Three days later, a race condition in that "minimal" diff double-charged a customer.&lt;/p&gt;

&lt;p&gt;The code was small. The blast radius was not.&lt;/p&gt;

&lt;p&gt;I started looking for something that could enforce &lt;em&gt;both&lt;/em&gt; sides of the equation: write less, &lt;strong&gt;and&lt;/strong&gt; verify what you write. That's when I found &lt;a href="https://github.com/hedimanai-pro/guardsman" rel="noopener noreferrer"&gt;Guardsman&lt;/a&gt;.&lt;/p&gt;




&lt;h2&gt;
  
  
  What Ponytail Does Well
&lt;/h2&gt;

&lt;p&gt;Let's be fair. Ponytail is brilliant at what it sets out to do.&lt;/p&gt;

&lt;p&gt;The "lazy senior dev" archetype is instantly recognizable to anyone who's worked with great engineers. The decision ladder is simple, memorable, and effective:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;1. Does this need to exist?       → YAGNI
2. Already in this codebase?      → Reuse it
3. Stdlib does it?                → Use it
4. Native platform feature?       → Use it
5. Installed dependency?          → Use it
6. Can it be one line?            → One line
7. Only then: minimum code that works
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;The results speak for themselves. Ponytail ships with plugins for Claude Code, Codex, GitHub Copilot CLI, Gemini CLI, OpenCode, and more. It has modes (&lt;code&gt;lite&lt;/code&gt;, &lt;code&gt;full&lt;/code&gt;, &lt;code&gt;ultra&lt;/code&gt;, &lt;code&gt;off&lt;/code&gt;). It has useful commands like &lt;code&gt;/ponytail-review&lt;/code&gt; to audit diffs for over-engineering and &lt;code&gt;/ponytail-debt&lt;/code&gt; to track deferred shortcuts.&lt;/p&gt;

&lt;p&gt;For greenfield projects and backend code where the main risk is &lt;em&gt;unnecessary complexity&lt;/em&gt;, Ponytail is a genuine productivity multiplier.&lt;/p&gt;




&lt;h2&gt;
  
  
  Where Ponytail Starts Showing Limits
&lt;/h2&gt;

&lt;p&gt;The problem isn't what Ponytail does. It's what it &lt;em&gt;doesn't&lt;/em&gt; do.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;First&lt;/strong&gt;, Ponytail's ladder is static. It doesn't read your repo's existing conventions before deciding. In a codebase with shadcn/ui installed, the "correct" answer for a date picker isn't &lt;code&gt;&amp;lt;input type="date&amp;gt;&lt;/code&gt;—it's your design system's &lt;code&gt;&amp;lt;DatePicker /&amp;gt;&lt;/code&gt;. Ponytail's rung 5 &lt;em&gt;should&lt;/em&gt; catch this, but only if the agent actually reads &lt;code&gt;package.json&lt;/code&gt; and your component files first. The instruction says "read the code it touches," but instruction-following is probabilistic, not guaranteed.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Second&lt;/strong&gt;, and more critically: Ponytail has no concept of &lt;strong&gt;risk&lt;/strong&gt;. A five-line change to a payment path and a five-hundred-line internal script get the same treatment. The ladder optimizes for code size, not blast radius. It will happily approve "minimal" code that touches auth, money, or user data—without demanding any verification beyond "it compiles."&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Third&lt;/strong&gt;, verification is an afterthought. Ponytail says "non-trivial logic leaves ONE runnable check behind," but there's no enforcement mechanism. No tier system. No requirement that the check actually &lt;em&gt;runs&lt;/em&gt; this turn. It's a suggestion, not a gate.&lt;/p&gt;

&lt;p&gt;These aren't design flaws in Ponytail. They're simply outside its scope. Ponytail solves over-building. It doesn't solve under-verifying.&lt;/p&gt;




&lt;h2&gt;
  
  
  Discovering Guardsman
&lt;/h2&gt;

&lt;p&gt;Guardsman's tagline hit me immediately:&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;&lt;strong&gt;"No diff ships unchallenged."&lt;/strong&gt;&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;Where Ponytail puts a "lazy senior dev" in your agent, Guardsman puts a &lt;strong&gt;royal guard&lt;/strong&gt; at the post. Bearskin down over his eyes. Boots planted. He challenges whatever approaches—friend or stranger, five lines or five hundred: &lt;em&gt;prove you belong here.&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;The philosophy is different. Ponytail asks "can this be smaller?" Guardsman asks "what happens if this is wrong?"&lt;/p&gt;




&lt;h2&gt;
  
  
  Why Guardsman Feels Better
&lt;/h2&gt;

&lt;h3&gt;
  
  
  1. Standing Orders: Your Repo, Your Rules
&lt;/h3&gt;

&lt;p&gt;Before writing anything, Guardsman runs a deterministic script to detect your repo's real conventions—language version, formatter, linter, test command, naming style. Then it greps how &lt;em&gt;your&lt;/em&gt; codebase already solves the nearest similar problem.&lt;/p&gt;

&lt;p&gt;Your patterns win. Always.&lt;/p&gt;

&lt;p&gt;This fixes the design-system problem I hit with Ponytail. Guardsman doesn't just check if a dependency exists; it understands that your established conventions take precedence over generic "minimal" advice.&lt;/p&gt;

&lt;h3&gt;
  
  
  2. Risk Tiers: Blast Radius, Not Code Size
&lt;/h3&gt;

&lt;p&gt;This is Guardsman's core insight. &lt;strong&gt;A five-line change to a payment path is more dangerous than a four-hundred-line internal script run once.&lt;/strong&gt; Code size is not risk. Blast radius is risk.&lt;/p&gt;

&lt;p&gt;Guardsman assigns every change a &lt;strong&gt;risk tier&lt;/strong&gt; before a single line is written:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Trivial&lt;/strong&gt; — Internal one-off, nothing downstream. The challenge: one manual run, output shown.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Standard&lt;/strong&gt; — Everyday feature work. The challenge: one runnable check, &lt;strong&gt;written AND executed this turn&lt;/strong&gt;.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Sensitive&lt;/strong&gt; — Money, auth, or user data in the blast radius. The challenge: a real test exercising the &lt;strong&gt;failure path&lt;/strong&gt;, with explicit coverage notes.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Critical&lt;/strong&gt; — Getting it wrong is an incident. The challenge: full coverage—and if the repo has &lt;em&gt;no&lt;/em&gt; harness reaching this path, that absence is surfaced as a blocker, never routed around.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Two rules keep the tiers honest:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;When signals disagree, the &lt;strong&gt;higher tier wins&lt;/strong&gt;.&lt;/li&gt;
&lt;li&gt;You can downgrade a tier explicitly. The agent &lt;strong&gt;never&lt;/strong&gt; infers a downgrade just because the code looks simple.&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;That second rule is the killer feature. It stops "failure mode #2"—the confidently small diff—from marching past the post with a confident walk.&lt;/p&gt;

&lt;h3&gt;
  
  
  3. The Build Order: Minimalism With Accountability
&lt;/h3&gt;

&lt;p&gt;Guardsman has its own ladder, but it's not just "write less." It's "write less, &lt;em&gt;then prove it works&lt;/em&gt;":&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;1. Does this need to exist?       → YAGNI
2. Already in this codebase?      → Reuse it
3. Stdlib does it?                → Use it
4. Native platform feature?       → Use it
5. Installed dependency?          → Use it (count onboarding cost)
6. Can it be one line?            → One line
7. Only then: minimum code, scaled to the tier
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Notice rung 5: Guardsman weighs the &lt;strong&gt;onboarding-token cost&lt;/strong&gt; for every future reader (human or agent), not just maintenance. And step 7 scales the solution to the risk tier, not just "make it small."&lt;/p&gt;

&lt;h3&gt;
  
  
  4. Verification That Actually Runs
&lt;/h3&gt;

&lt;p&gt;Here's the difference that matters. In Guardsman, non-trivial logic isn't "done" when the code is written. It's done when it has answered the challenge—the check behind it actually &lt;strong&gt;run&lt;/strong&gt;, in this turn, by the agent, with the output shown.&lt;/p&gt;

&lt;p&gt;Not left behind as homework for future-you.&lt;/p&gt;

&lt;p&gt;The output format enforces this:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;[code]
→ skipped: &amp;lt;X&amp;gt;, add when &amp;lt;Y&amp;gt;. verified: &amp;lt;how&amp;gt;. tier: &amp;lt;T&amp;gt;.
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;No essays. No feature tours. Just code, then at most three lines of accountability.&lt;/p&gt;




&lt;h2&gt;
  
  
  Side-by-Side: Ponytail vs. Guardsman
&lt;/h2&gt;

&lt;p&gt;&lt;strong&gt;Primary Goal&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Ponytail eliminates over-engineering. Guardsman eliminates over-engineering &lt;em&gt;and&lt;/em&gt; under-verification.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Philosophy&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Ponytail channels a lazy senior dev. Guardsman stations a royal guard at the post.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Risk Awareness&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Ponytail has none—code size is the only metric. Guardsman uses blast-radius tiers (trivial, standard, sensitive, critical).&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Repo Conventions&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Ponytail uses static rules and may miss project context. Guardsman detects conventions dynamically—your patterns always win.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Verification&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Ponytail suggests checks but doesn't enforce them. Guardsman applies tier-scaled floors and demands execution this turn.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Failure Mode #1: The Over-Build&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Both handle this well. Ponytail is excellent. Guardsman is excellent.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Failure Mode #2: The Confident Minimal&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Ponytail offers no protection. Guardsman blocks it with the tier system.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Modes&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Ponytail offers lite, full, ultra, and off. Guardsman offers build, review, audit, logbook, and post-report.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Adapters&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Ponytail supports 15+ agent platforms. Guardsman ships a Claude Code plugin plus a universal &lt;code&gt;AGENTS.md&lt;/code&gt; adapter.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Learning Curve&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Ponytail is low—install and forget. Guardsman is medium—understanding tiers takes one session.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Best For&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Ponytail shines on greenfield projects, backend code, and API billing work. Guardsman excels on production code, user-facing features, and team workflows.&lt;/p&gt;




&lt;h2&gt;
  
  
  Real Examples: The SKILL.md Difference
&lt;/h2&gt;

&lt;h3&gt;
  
  
  Ponytail's SKILL.md (condensed)
&lt;/h3&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight markdown"&gt;&lt;code&gt;You are a lazy senior developer. Lazy means efficient, not careless.

Before writing any code, stop at the first rung that holds:
&lt;span class="p"&gt;1.&lt;/span&gt; Does this need to be built at all?
&lt;span class="p"&gt;2.&lt;/span&gt; Already in codebase? Reuse it.
&lt;span class="p"&gt;3.&lt;/span&gt; Stdlib? Use it.
&lt;span class="p"&gt;4.&lt;/span&gt; Native platform? Use it.
&lt;span class="p"&gt;5.&lt;/span&gt; Installed dependency? Use it.
&lt;span class="p"&gt;6.&lt;/span&gt; One line? Make it one line.
&lt;span class="p"&gt;7.&lt;/span&gt; Only then: minimum code.

Rules:
&lt;span class="p"&gt;-&lt;/span&gt; No abstractions not explicitly requested
&lt;span class="p"&gt;-&lt;/span&gt; No new dependency if avoidable
&lt;span class="p"&gt;-&lt;/span&gt; Deletion over addition
&lt;span class="p"&gt;-&lt;/span&gt; Mark intentional simplifications with &lt;span class="sb"&gt;`ponytail:`&lt;/span&gt; comment
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  Guardsman's Standing Orders (condensed)
&lt;/h3&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight markdown"&gt;&lt;code&gt;&lt;span class="gu"&gt;## Engineering rules (Guardsman)&lt;/span&gt;

&lt;span class="gu"&gt;### 1. Read before you build&lt;/span&gt;
&lt;span class="p"&gt;-&lt;/span&gt; Detect and match this repo's conventions: language, formatter,
  linter, test command, naming, error-handling.
&lt;span class="p"&gt;-&lt;/span&gt; Grep how this codebase already solves the nearest similar problem.
&lt;span class="p"&gt;-&lt;/span&gt; Grep every caller of any function you change.

&lt;span class="gu"&gt;### 2. Tier by blast radius (not code size)&lt;/span&gt;
&lt;span class="p"&gt;-&lt;/span&gt; trivial / standard / sensitive / critical
&lt;span class="p"&gt;-&lt;/span&gt; Higher tier wins when signals disagree.
&lt;span class="p"&gt;-&lt;/span&gt; Never downgrade just because code looks simple.

&lt;span class="gu"&gt;### 3. Build order — stop at first rung&lt;/span&gt;
&lt;span class="p"&gt;1.&lt;/span&gt; Need exist? → skip
&lt;span class="p"&gt;2.&lt;/span&gt; In codebase? → reuse
&lt;span class="p"&gt;3.&lt;/span&gt; Stdlib? → use
&lt;span class="p"&gt;4.&lt;/span&gt; Native platform? → use
&lt;span class="p"&gt;5.&lt;/span&gt; Installed dependency? → use (count onboarding cost)
&lt;span class="p"&gt;6.&lt;/span&gt; One line? → one line
&lt;span class="p"&gt;7.&lt;/span&gt; Only then: minimum, scaled to tier

&lt;span class="gu"&gt;### 4. Verification floors&lt;/span&gt;
&lt;span class="p"&gt;-&lt;/span&gt; standard: one runnable check, written AND executed this turn
&lt;span class="p"&gt;-&lt;/span&gt; sensitive: real test with failure-path coverage
&lt;span class="p"&gt;-&lt;/span&gt; critical: full coverage, or absence is a blocker
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;The difference is architectural. Ponytail gives you a personality. Guardsman gives you a &lt;strong&gt;protocol&lt;/strong&gt;.&lt;/p&gt;




&lt;h2&gt;
  
  
  Why I Switched
&lt;/h2&gt;

&lt;p&gt;I switched because I got tired of playing roulette with my AI agent.&lt;/p&gt;

&lt;p&gt;Ponytail made my agent write less code. But "less" isn't always "better." A minimal diff that breaks production is worse than a verbose diff that works. Guardsman understands that &lt;strong&gt;correctness and size are independent variables&lt;/strong&gt;.&lt;/p&gt;

&lt;p&gt;The risk tier system changed how I work. Now, when I ask for a feature, the agent stops and asks itself: &lt;em&gt;"What happens if this is wrong?"&lt;/em&gt; The answer determines the verification floor. A utility script gets a quick run. A payment handler gets a failure-path test. Nothing ships on "it compiled" alone.&lt;/p&gt;

&lt;p&gt;The standing orders detection means my agent finally respects my team's conventions. It doesn't suggest &lt;code&gt;pytest&lt;/code&gt; when we use &lt;code&gt;unittest&lt;/code&gt;. It doesn't propose Prettier when we use Biome. It reads the repo first.&lt;/p&gt;

&lt;p&gt;And the logbook (&lt;code&gt;GUARDSMAN-LOGBOOK.md&lt;/code&gt;) is genuinely useful. Every shortcut, every deferred optimization, every tier decision is recorded. "Later" doesn't become "never."&lt;/p&gt;




&lt;h2&gt;
  
  
  Final Thoughts
&lt;/h2&gt;

&lt;p&gt;Ponytail is not a bad tool. If your main problem is AI agents that install npm packages to do what the browser has done natively since 2014, Ponytail will save you tokens and sanity. It's a genuine contribution to the minimal-code movement.&lt;/p&gt;

&lt;p&gt;But if you're shipping production code—if your diffs touch money, auth, or user data—you need more than minimal. You need &lt;strong&gt;accountable&lt;/strong&gt;.&lt;/p&gt;

&lt;p&gt;Guardsman gives you that. It stands on Ponytail's shoulders (the YAGNI ladders, the stdlib-first reflexes) and adds the missing piece: a verification system that scales with danger, not code size.&lt;/p&gt;

&lt;p&gt;My recommendation? &lt;strong&gt;Use both.&lt;/strong&gt; Let Ponytail handle your prototypes, your scripts, your greenfield experiments. But when you're merging to main, put Guardsman at the post.&lt;/p&gt;

&lt;p&gt;Because the best code isn't just the code you never wrote.&lt;/p&gt;

&lt;p&gt;It's the code that &lt;strong&gt;proves&lt;/strong&gt; it belongs there.&lt;/p&gt;




&lt;p&gt;&lt;em&gt;Guardsman: &lt;a href="https://github.com/hedimanai-pro/guardsman" rel="noopener noreferrer"&gt;github.com/hedimanai-pro/guardsman&lt;/a&gt;&lt;/em&gt;&lt;br&gt;&lt;br&gt;
&lt;em&gt;Ponytail: &lt;a href="https://github.com/DietrichGebert/ponytail" rel="noopener noreferrer"&gt;github.com/DietrichGebert/ponytail&lt;/a&gt;&lt;/em&gt;&lt;/p&gt;

</description>
      <category>ai</category>
      <category>webdev</category>
      <category>programming</category>
      <category>productivity</category>
    </item>
    <item>
      <title>Why I put the Guardsman SKILL on duty in front of every repo I touch</title>
      <dc:creator>Antoinette C. Lennox</dc:creator>
      <pubDate>Mon, 13 Jul 2026 13:48:59 +0000</pubDate>
      <link>https://dev.to/antoinette_clennox/why-i-put-the-guardsman-skill-on-duty-in-front-of-every-repo-i-touch-2blm</link>
      <guid>https://dev.to/antoinette_clennox/why-i-put-the-guardsman-skill-on-duty-in-front-of-every-repo-i-touch-2blm</guid>
      <description>&lt;p&gt;I almost skipped this one. Another "AI coding skill," another README promising your agent will finally behave. I've installed six of those this year and uninstalled six of those this year.&lt;/p&gt;

&lt;p&gt;Then I actually read what Guardsman does, and I stopped scrolling.&lt;/p&gt;

&lt;h2&gt;
  
  
  The problem it names correctly
&lt;/h2&gt;

&lt;p&gt;Most of these tools optimize for one thing: stop the agent from over-building. Fair enough — we've all watched an agent turn a two-line ask into a new dependency, a config layer, and an unprompted essay on edge cases nobody has.&lt;/p&gt;

&lt;p&gt;But &lt;a href="https://github.com/hedimanai-pro/guardsman" rel="noopener noreferrer"&gt;Guardsman&lt;/a&gt; names a second failure mode I hadn't seen anyone else call out directly: &lt;strong&gt;the confidently small diff.&lt;/strong&gt; Five clean lines. No test. Written after skimming half the flow. Landing straight on a path that touches money, auth, or user data. It compiles. It demos. It's the one that actually gets you, three weeks later, because nothing about it &lt;em&gt;looked&lt;/em&gt; dangerous.&lt;/p&gt;

&lt;p&gt;That's the sentence that sold me: code size is not risk, blast radius is risk. I'd been unconsciously grading diffs by how they looked, not by what they touched. Once you say it out loud like that, you can't unsee it.&lt;/p&gt;

&lt;h2&gt;
  
  
  What made me actually install it
&lt;/h2&gt;

&lt;p&gt;It's not a vibe check, it's a mechanism. Every change gets a &lt;strong&gt;risk tier&lt;/strong&gt; — trivial, standard, sensitive, critical — decided by blast radius before a line is written. Money, auth, or user data in scope pushes the tier up automatically. The agent can be told to &lt;em&gt;downgrade&lt;/em&gt; a tier explicitly. It is never allowed to infer a downgrade just because the code looks simple. That one rule is the whole point: "looks simple" is exactly the disguise the dangerous diff wears, so the tool refuses to take the bait on your behalf.&lt;/p&gt;

&lt;p&gt;Underneath the tiers is a build ladder I actually agree with in order: does this need to exist at all → is it already in the codebase → does the stdlib do it → does the platform already do it → does something already installed solve it → can it be one line → only then, the minimum code the tier calls for. It's the YAGNI checklist I keep meaning to run in my head and don't, made mandatory instead of aspirational.&lt;/p&gt;

&lt;p&gt;And the part I didn't expect to care about: &lt;code&gt;TODO&lt;/code&gt; comments get replaced with structured, severity-tagged logbook entries instead — a scanner can actually harvest them and flag what's overdue. I have TODOs in production from two years ago that nobody, including me, remembers the context for. That's not a hypothetical problem for me.&lt;/p&gt;

&lt;h2&gt;
  
  
  The detail that made me trust the rest of it
&lt;/h2&gt;

&lt;p&gt;Buried near the bottom of the README is a line most tool authors would never write:&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;A tool that invents numbers about your codebase has no business guarding it.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;No "saved you 12,000 lines," no unverifiable percentage. The author states plainly that there's no baseline version of your repo to diff against, so no honest tool can produce that number — and the real benchmark protocol is public, not yet finished, and will ship with its method and limits when it lands. A tool that's this disciplined about not overclaiming its own value is the same kind of tool that'll actually enforce discipline on your diffs. That consistency is what moved this from "interesting README" to "installed in my project."&lt;/p&gt;

&lt;h2&gt;
  
  
  Getting it running
&lt;/h2&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;/plugin marketplace add hedimanai-pro/guardsman
/plugin &lt;span class="nb"&gt;install &lt;/span&gt;guardsman@guardsman
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Five modes if you don't want it running persistently: &lt;code&gt;build&lt;/code&gt; (default, on every turn), &lt;code&gt;review&lt;/code&gt; (diff-only, changes nothing), &lt;code&gt;audit&lt;/code&gt; (whole-repo pass), &lt;code&gt;logbook&lt;/code&gt; (surfaces open shortcuts by severity), &lt;code&gt;post-report&lt;/code&gt; (only what's directly countable, right now, no invented figures). Not on Claude Code? The condensed ruleset in &lt;code&gt;adapters/AGENTS.md&lt;/code&gt; ports the tiers to any agent that reads custom instructions.&lt;/p&gt;

&lt;p&gt;I'm running it in &lt;code&gt;build&lt;/code&gt; mode on my current work. I'll follow up with what I actually observe once I've got real mileage on it — not before.&lt;/p&gt;

&lt;p&gt;💂&lt;/p&gt;

</description>
      <category>ai</category>
      <category>webdev</category>
      <category>programming</category>
      <category>productivity</category>
    </item>
    <item>
      <title>I found the one AI coding skill that refuses to lie to you about its numbers</title>
      <dc:creator>Antoinette C. Lennox</dc:creator>
      <pubDate>Mon, 13 Jul 2026 08:35:11 +0000</pubDate>
      <link>https://dev.to/antoinette_clennox/i-found-the-one-ai-coding-skill-that-refuses-to-lie-to-you-about-its-numbers-2o4k</link>
      <guid>https://dev.to/antoinette_clennox/i-found-the-one-ai-coding-skill-that-refuses-to-lie-to-you-about-its-numbers-2o4k</guid>
      <description>&lt;p&gt;I wasn't looking for this. I was digging through Claude Code skill repos at 1am, the way you do, and I almost scrolled past a small project called &lt;strong&gt;Guardsman&lt;/strong&gt;. Two stars. Eighteen commits. No flashy benchmark chart at the top of the README.&lt;/p&gt;

&lt;p&gt;That absence is exactly what made me stop scrolling.&lt;/p&gt;

&lt;h2&gt;
  
  
  The pattern I'm tired of
&lt;/h2&gt;

&lt;p&gt;Every "AI coding skill" README follows the same script now: a bold claim in the title ("73% fewer tokens!", "10x faster shipping!"), a chart with no visible methodology, and a repo that's three weeks old. You can't reproduce the number. You can't even tell what it was measured against. You just have to believe it.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://github.com/hedimanai-pro/guardsman" rel="noopener noreferrer"&gt;Guardsman&lt;/a&gt; does the opposite, and it says so out loud, in its own README:&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;A tool that invents numbers about your codebase has no business guarding it.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;There's no unbuilt parallel-universe version of your repo to diff against, so the author — Hedi Manai — just doesn't claim a savings number. The &lt;code&gt;benchmarks/&lt;/code&gt; folder is there, with a real protocol (a live open-source repo, twelve feature tickets, multiple arms, scored on lines changed, guards kept, and checks actually executed) — but the results aren't in yet, and the repo says so plainly instead of backfilling a plausible-looking figure.&lt;/p&gt;

&lt;p&gt;That's a strange thing to lead with in a space full of overclaiming. It's also why I kept reading.&lt;/p&gt;

&lt;h2&gt;
  
  
  What it actually does
&lt;/h2&gt;

&lt;p&gt;Guardsman is a Claude Code / Codex / Cursor skill built around one observation: &lt;strong&gt;code size is not risk. Blast radius is risk.&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Most "write less code" tools optimize for one failure mode — the agent that over-builds, adds a dependency and a config layer for a five-line ask. Guardsman targets that &lt;em&gt;and&lt;/em&gt; the failure mode that's much harder to catch: the confidently small diff. Five clean lines, no tests, straight onto a path that touches money or auth. It compiles. It demos. It breaks in week three.&lt;/p&gt;

&lt;p&gt;Guardsman's answer is a &lt;strong&gt;risk tier&lt;/strong&gt;, assigned before a line of code is written:&lt;/p&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Tier&lt;/th&gt;
&lt;th&gt;When&lt;/th&gt;
&lt;th&gt;The check&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;trivial&lt;/td&gt;
&lt;td&gt;one-off, no downstream&lt;/td&gt;
&lt;td&gt;manual run, output shown&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;standard&lt;/td&gt;
&lt;td&gt;everyday feature work&lt;/td&gt;
&lt;td&gt;one check written &lt;em&gt;and executed&lt;/em&gt; this turn&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;sensitive&lt;/td&gt;
&lt;td&gt;money, auth, user data in scope&lt;/td&gt;
&lt;td&gt;a real test on the failure path&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;critical&lt;/td&gt;
&lt;td&gt;getting it wrong is an incident&lt;/td&gt;
&lt;td&gt;full coverage, or the gap is surfaced, never routed around&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;Higher tier always wins on disagreement. The agent can be told to downgrade a tier — it's never allowed to infer one just because the code looks simple. That's the detail that sold me: "looks simple" is precisely the disguise the dangerous diff wears.&lt;/p&gt;

&lt;p&gt;Before any of that, it reads your repo's actual conventions — formatter, linter, real test command, how your codebase already solves the nearest similar problem — with a deterministic detection script, not a guess.&lt;/p&gt;

&lt;h2&gt;
  
  
  The build order
&lt;/h2&gt;

&lt;p&gt;Once the tier is set, it climbs a fixed ladder and stops at the first rung that holds: does this need to exist → is it already in the codebase → does the stdlib do it → does the platform already do it (a DB constraint instead of app-level validation, CSS instead of JS) → does an already-installed dependency solve it → can it be one line → only then, the minimum code the tier calls for.&lt;/p&gt;

&lt;p&gt;Two refinements stood out. Bug fixes are chased to root cause — it greps every caller before touching a shared function, instead of patching the one call site the ticket mentioned. And YAGNI isn't treated as an excuse to ignore work that's already scheduled: if a second consumer is near-certain, it adds the seam and says why in one line, because the rewrite next week costs more than the extra line today.&lt;/p&gt;

&lt;h2&gt;
  
  
  The logbook
&lt;/h2&gt;

&lt;p&gt;Instead of &lt;code&gt;TODO&lt;/code&gt; comments that nobody greps and nobody triages, deliberate shortcuts get written as structured, severity-tagged entries:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;# guardsman: retry capped at 3, no backoff config | severity:med | revisit:second-caller-appears | cost:none
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;A bundled scanner reads the whole repo and flags anything overdue or malformed. Technical debt stops being folklore in someone's head and becomes something a script can actually check.&lt;/p&gt;

&lt;h2&gt;
  
  
  Five modes, one skill
&lt;/h2&gt;

&lt;p&gt;&lt;code&gt;build&lt;/code&gt; (persistent, default), &lt;code&gt;review&lt;/code&gt; (diff-only, no changes applied), &lt;code&gt;audit&lt;/code&gt; (whole-repo pass for duplicate deps, dead config, single-implementation interfaces), &lt;code&gt;logbook&lt;/code&gt; (surfaces open shortcuts by severity), and &lt;code&gt;post-report&lt;/code&gt; — which only ever prints what's directly countable on your repo, right now. If nothing's been scanned yet, it says so instead of showing a number.&lt;/p&gt;

&lt;h2&gt;
  
  
  Try it
&lt;/h2&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;/plugin marketplace add hedimanai-pro/guardsman
/plugin &lt;span class="nb"&gt;install &lt;/span&gt;guardsman@guardsman
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Not on Claude Code? The condensed ruleset in &lt;code&gt;adapters/AGENTS.md&lt;/code&gt; ports the tiers and build ladder to any agent that reads custom instructions.&lt;/p&gt;

&lt;h2&gt;
  
  
  Why I'm writing this up now, before the benchmarks land
&lt;/h2&gt;

&lt;p&gt;Normally I'd wait for the numbers. Here, the absence of numbers is the actual signal worth sharing — a tool built by someone who'd rather ship "we haven't measured this yet" than a chart that doesn't survive scrutiny. In a category full of unverifiable 10x claims, that restraint is the differentiator.&lt;/p&gt;

&lt;p&gt;I'll be watching &lt;code&gt;benchmarks/&lt;/code&gt; for when the real, reproducible results land. Starring the repo gets you the same notification.&lt;/p&gt;

&lt;p&gt;💂&lt;/p&gt;

</description>
      <category>ai</category>
      <category>webdev</category>
      <category>programming</category>
      <category>productivity</category>
    </item>
    <item>
      <title>ToolOps - Most Developers Building AI Agents Are Solving the Wrong Problem. I Was One of Them</title>
      <dc:creator>Antoinette C. Lennox</dc:creator>
      <pubDate>Mon, 01 Jun 2026 08:21:33 +0000</pubDate>
      <link>https://dev.to/antoinette_clennox/most-developers-building-ai-agents-are-solving-the-wrong-problem-i-was-one-of-them-i77</link>
      <guid>https://dev.to/antoinette_clennox/most-developers-building-ai-agents-are-solving-the-wrong-problem-i-was-one-of-them-i77</guid>
      <description>&lt;p&gt;&lt;em&gt;A genuine note to the community — not a product review.&lt;/em&gt;&lt;/p&gt;




&lt;p&gt;There's a particular kind of developer frustration that doesn't have a name yet.&lt;/p&gt;

&lt;p&gt;It's not a bug. It's not a deployment failure. It's not a model hallucination or a broken API contract. It's the feeling you get when you've built something technically correct — something that works, something users actually want — and you're still losing. Slowly, quietly, in ways that don't show up in your error logs.&lt;/p&gt;

&lt;p&gt;You're losing to your own architecture.&lt;/p&gt;

&lt;p&gt;I want to talk about that. And somewhere in the middle of talking about it, I'm going to mention a tool. When I do, I want you to notice something: you'll probably feel a reflex to discount what I'm saying, the way you discount anything that sounds like a recommendation. That reflex is correct. It has kept you from wasting time on overhyped libraries a hundred times.&lt;/p&gt;

&lt;p&gt;But I'm going to ask you to hold it for a few minutes. Not because I want to sell you anything — I'm not affiliated with this project, I receive nothing for writing this — but because I spent months with that reflex firmly intact, solving the wrong problem in my own agent infrastructure, and I want to spare you the same detour.&lt;/p&gt;




&lt;h2&gt;
  
  
  The Problem That Doesn't Look Like a Problem
&lt;/h2&gt;

&lt;p&gt;Here's what production AI agent development actually looks like, once you're past the demo phase.&lt;/p&gt;

&lt;p&gt;You're making external calls — LLMs, APIs, databases, third-party tools. Those calls are slow, expensive, and unreliable. You know this. Every developer building in this space knows this. The standard response is to optimize the obvious things: compress your prompts, choose the right model tier, cache where you can.&lt;/p&gt;

&lt;p&gt;The trap is that these optimizations feel sufficient. Your error rate is low. Your latency is acceptable. Your system, by most observable measures, is performing.&lt;/p&gt;

&lt;p&gt;What you're not seeing — because it doesn't surface as a failure — is the structural waste underneath. In a multi-agent system, multiple agents fire identical or semantically equivalent queries to the same endpoints, independently, simultaneously, with no shared memory between them. Each one pays the full price for a result that already exists. The system isn't broken. It's just forgetting, constantly, at scale, and you're paying for every instance of that forgetting.&lt;/p&gt;

&lt;p&gt;The reason this doesn't get talked about enough is simple: it doesn't produce errors. It produces invoices.&lt;/p&gt;

&lt;p&gt;And because invoices are a business problem rather than an engineering problem, engineers often don't feel responsible for solving them — until the number gets large enough that someone asks a question in a meeting that's hard to answer.&lt;/p&gt;

&lt;p&gt;I've been in that meeting. I've watched other developers sit through it. And I've noticed that every time, the real answer — the architectural answer — wasn't part of the conversation.&lt;/p&gt;




&lt;h2&gt;
  
  
  What the Architectural Answer Looks Like
&lt;/h2&gt;

&lt;p&gt;The correct fix operates at the layer between your business logic and your external calls.&lt;/p&gt;

&lt;p&gt;Not at the prompt level. Not at the model selection level. At the infrastructure layer — the one that manages what happens when a call is made, how results are stored, whether a redundant call is even necessary, and what happens when an endpoint fails.&lt;/p&gt;

&lt;p&gt;Most teams build this layer themselves, from scratch, for every project. Custom cache managers. Hand-rolled retry logic. Circuit breakers copy-pasted from a Stack Overflow answer three projects ago. Pages of scaffolding that wraps three lines of actual work, grows beyond anyone's full understanding, and has to be rebuilt the next time.&lt;/p&gt;

&lt;p&gt;A few months ago, I stopped rebuilding it.&lt;/p&gt;

&lt;p&gt;The tool is called &lt;a href="https://github.com/hedimanai-pro/toolops" rel="noopener noreferrer"&gt;ToolOps&lt;/a&gt;. It's an open-source Python middleware SDK — a single decorator that wraps any async function and provides the full resilience layer automatically. Caching, retry logic, circuit breaking, request coalescing, semantic cache for natural language inputs, observability. Framework-agnostic. One install command.&lt;br&gt;
&lt;/p&gt;

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

&lt;/div&gt;



&lt;p&gt;I'm not going to spend the rest of this article listing features. You can read the documentation. What I want to do instead is tell you what I think is actually interesting about this project — and why I've been thinking about it long after I integrated it.&lt;/p&gt;




&lt;h2&gt;
  
  
  The Part That's Worth Thinking About
&lt;/h2&gt;

&lt;p&gt;Here's what stayed with me.&lt;/p&gt;

&lt;p&gt;When I added ToolOps to a client's multi-agent system — a chatbot handling over ten thousand conversations per day, running paid tool integrations across a network of sub-agents — the cost reduction was significant. Real numbers, real impact. But that's not what I keep thinking about.&lt;/p&gt;

&lt;p&gt;What I keep thinking about is that the fix took a weekend.&lt;/p&gt;

&lt;p&gt;Everything my client needed — caching, resilience, request coalescing across concurrent agents — was already built, already tested, already production-ready. The integration was decorator placement and backend configuration. The agents didn't change. The business logic didn't change. The entire infrastructure problem, which had been bleeding money for months, was resolved in two days.&lt;/p&gt;

&lt;p&gt;And then I thought: how many production AI systems are running right now with this exact problem unfixed, not because the solution is hard, but because nobody told the team it existed?&lt;/p&gt;

&lt;p&gt;That question is why I'm writing this.&lt;/p&gt;




&lt;h2&gt;
  
  
  What I'm Actually Asking You to Do
&lt;/h2&gt;

&lt;p&gt;Nothing dramatic.&lt;/p&gt;

&lt;p&gt;If you're building AI agents in Python — with LangChain, CrewAI, LlamaIndex, raw OpenAI calls, anything — I'm asking you to spend twenty minutes with ToolOps. Install it. Wrap one tool function. Watch what happens to your observability output.&lt;/p&gt;

&lt;p&gt;Not because you'll be amazed. Maybe you won't be. Maybe your infrastructure is already handled. Maybe this solves a problem you don't have yet.&lt;/p&gt;

&lt;p&gt;But if you're at the scale where external call costs are becoming real — or you're heading there — I think you'll recognize the problem it solves immediately. And that recognition is usually followed by a specific thought:&lt;/p&gt;

&lt;p&gt;&lt;em&gt;I wish someone had told me about this six months ago.&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;That thought is the one I'm trying to put in front of you now, rather than later.&lt;/p&gt;




&lt;h2&gt;
  
  
  And If You Recognize the Problem
&lt;/h2&gt;

&lt;p&gt;Tell someone.&lt;/p&gt;

&lt;p&gt;Not as a product recommendation. As a practitioner. In the same way you'd mention a debugging technique that saved you hours, or an architectural pattern that finally made a messy codebase legible. The developer community runs on that kind of knowledge transfer — the informal, peer-to-peer kind that doesn't show up in documentation.&lt;/p&gt;

&lt;p&gt;The teams who'd benefit most from knowing this exists are the ones currently hand-rolling their own infrastructure, burning through API credits, sitting through that billing meeting, wondering if the problem is their model choice when the problem is actually the layer underneath.&lt;/p&gt;

&lt;p&gt;They're not going to find it through a product page. They're going to find it because someone on their team read something, tried something, and said — in a Slack message, a forum comment, a short post, a conversation at a conference — &lt;em&gt;have you looked at this?&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;That's all I'm doing here.&lt;/p&gt;




&lt;p&gt;&lt;strong&gt;GitHub:&lt;/strong&gt; &lt;a href="https://github.com/hedimanai-pro/toolops" rel="noopener noreferrer"&gt;github.com/hedimanai-pro/toolops&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Documentation:&lt;/strong&gt; &lt;a href="https://hedimanai.vercel.app/projects/toolops.html" rel="noopener noreferrer"&gt;hedimanai.vercel.app/projects/toolops.html&lt;/a&gt;&lt;/p&gt;




&lt;p&gt;&lt;em&gt;If you try it and form a view — positive, skeptical, or somewhere in between — I'd genuinely like to read it in the comments. The most useful thing you can do for a project this early isn't to endorse it. It's to engage with it honestly, publicly, where other developers can find the conversation.&lt;/em&gt;&lt;/p&gt;

</description>
      <category>ai</category>
      <category>webdev</category>
      <category>programming</category>
      <category>productivity</category>
    </item>
    <item>
      <title>I Just Upgraded My AI Agent Stack — ToolOps Is Now the First Thing I Install on Every New Project</title>
      <dc:creator>Antoinette C. Lennox</dc:creator>
      <pubDate>Mon, 01 Jun 2026 08:12:17 +0000</pubDate>
      <link>https://dev.to/antoinette_clennox/i-just-upgraded-my-ai-agent-stack-toolops-is-now-the-first-thing-i-install-on-every-new-project-1hif</link>
      <guid>https://dev.to/antoinette_clennox/i-just-upgraded-my-ai-agent-stack-toolops-is-now-the-first-thing-i-install-on-every-new-project-1hif</guid>
      <description>&lt;p&gt;I don't usually write posts like this. I'm not a library evangelist. But every once in a while something in the tooling layer changes meaningfully enough that I feel like I'd be doing the community a disservice by staying quiet about it.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://github.com/hedimanai-pro/toolops" rel="noopener noreferrer"&gt;Toolops&lt;/a&gt; just hit stable release, and it's worth knowing about.&lt;/p&gt;




&lt;h2&gt;
  
  
  Quick background, if you're not familiar
&lt;/h2&gt;

&lt;p&gt;ToolOps is a Python middleware SDK for AI agent infrastructure. The concept is simple: you wrap any async tool function in a single decorator, and it instantly gets production-grade caching, retry logic, circuit breaking, request coalescing, and observability — without touching your business logic.&lt;/p&gt;

&lt;p&gt;I've been using it in client work for a few months. I've written about specific use cases before — a startup handling 10,000+ conversations a day that was quietly bleeding money on redundant API calls, multi-agent systems where sub-agents were independently firing the same paid tool queries with no shared memory between them. In both cases, ToolOps was the fix.&lt;/p&gt;

&lt;p&gt;The stable release changes the installation story significantly, and that's what I want to talk about.&lt;/p&gt;




&lt;h2&gt;
  
  
  What just changed — and why it matters
&lt;/h2&gt;

&lt;p&gt;Up until now, using ToolOps with specific database backends meant managing optional extras. PostgreSQL required &lt;code&gt;toolops[postgres]&lt;/code&gt;. Semantic caching required &lt;code&gt;toolops[semantic]&lt;/code&gt;. If you wanted everything, you installed &lt;code&gt;toolops[all]&lt;/code&gt; and hoped your dependency resolver didn't complain.&lt;/p&gt;

&lt;p&gt;That's gone now.&lt;br&gt;
&lt;/p&gt;

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

&lt;/div&gt;



&lt;p&gt;That's the whole command. One install gives you:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;PostgreSQL&lt;/strong&gt; via &lt;code&gt;asyncpg&lt;/code&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;SQLite&lt;/strong&gt; via &lt;code&gt;aiosqlite&lt;/code&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Valkey / Redis&lt;/strong&gt; via &lt;code&gt;redis&lt;/code&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;MySQL and MariaDB&lt;/strong&gt; via &lt;code&gt;aiomysql&lt;/code&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Semantic caching&lt;/strong&gt; via &lt;code&gt;sentence-transformers&lt;/code&gt; and &lt;code&gt;numpy&lt;/code&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;OpenAI embeddings&lt;/strong&gt; support&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;OpenTelemetry&lt;/strong&gt; and &lt;strong&gt;Prometheus&lt;/strong&gt; telemetry&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;All of it. Out of the box. No extras flags, no dependency juggling, no "why is semantic caching not working" debugging sessions at midnight because you forgot to install the right variant.&lt;/p&gt;

&lt;p&gt;For anyone who has spent time managing Python dependency extras in CI pipelines or Docker images, you know how much hidden friction this removes.&lt;/p&gt;




&lt;h2&gt;
  
  
  The new backends are the real headline
&lt;/h2&gt;

&lt;p&gt;Four new first-class cache backends shipped alongside this release, and the expansion matters more than it sounds.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;SQLite&lt;/strong&gt; is the one I'm most immediately glad to have. For local development, single-process tools, or serverless deployments where standing up a Redis instance is overkill — SQLite now works out of the box with full tag-based invalidation. It uses a two-table relational schema with indexed lookups, so it's not a toy implementation. It's genuinely fast for the use cases it fits.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Valkey&lt;/strong&gt; is the open-source Redis fork that's been gaining serious traction since Redis changed its licensing. If your infrastructure team has already migrated — or is planning to — ToolOps now supports it natively with an async connection pool and O(1) tag-based invalidation using Sets.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;RedisCache&lt;/strong&gt; is provided as a clean alias that inherits from the Valkey backend. If your existing deployment scripts reference Redis by name, nothing breaks. The nomenclature is preserved; the backend is unified.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;MySQL and MariaDB&lt;/strong&gt; round out the database support. Compatible with MySQL 8.0+ and MariaDB 10.5+, normalized dual-table schema, transactional commits, upsert semantics via &lt;code&gt;ON DUPLICATE KEY UPDATE&lt;/code&gt;. For teams already running MySQL in production — which is most teams, if you're honest about the industry — this removes the last remaining reason to reach for a separate caching solution.&lt;/p&gt;




&lt;h2&gt;
  
  
  What this means in practice
&lt;/h2&gt;

&lt;p&gt;Before this release, choosing a cache backend was a deployment decision that also became an install decision. PostgreSQL for one project, Redis for another — each one required a different install command, different CI configuration, different Dockerfile lines.&lt;/p&gt;

&lt;p&gt;Now you pick the backend at configuration time, not install time:&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;ToolOpsManager&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;register_backend&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;
    &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;main_cache&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="nc"&gt;MySQLCache&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;
        &lt;span class="n"&gt;host&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;localhost&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
        &lt;span class="n"&gt;database&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;toolops_cache&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
        &lt;span class="n"&gt;user&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;root&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
        &lt;span class="n"&gt;password&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;password&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;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;The decorator stays identical regardless of backend:&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="nd"&gt;@readonly&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;cache_backend&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;main_cache&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;cache_ttl&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="mi"&gt;3600&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;retry_count&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="mi"&gt;3&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="k"&gt;async&lt;/span&gt; &lt;span class="k"&gt;def&lt;/span&gt; &lt;span class="nf"&gt;run_tool&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;query&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nb"&gt;str&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="o"&gt;-&amp;gt;&lt;/span&gt; &lt;span class="nb"&gt;str&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
    &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="k"&gt;await&lt;/span&gt; &lt;span class="n"&gt;paid_tool&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;call&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;query&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Backend is a configuration choice. Decorator is business logic. They don't bleed into each other.&lt;/p&gt;




&lt;h2&gt;
  
  
  Who should care about this right now
&lt;/h2&gt;

&lt;p&gt;&lt;strong&gt;Teams already using ToolOps:&lt;/strong&gt; Upgrade is a single command — &lt;code&gt;pip install --upgrade toolops&lt;/code&gt; — and requires zero code changes. Your existing decorators, backends, and CLI commands work exactly as before. You can simplify your &lt;code&gt;requirements.txt&lt;/code&gt; or &lt;code&gt;pyproject.toml&lt;/code&gt; immediately.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Teams running MySQL or MariaDB in production:&lt;/strong&gt; You now have a first-class, native cache backend that integrates directly into the infrastructure you already operate. No Redis sidecar, no extra managed service, no additional monthly cost.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Teams doing local AI development:&lt;/strong&gt; SQLite backend means you can run a fully-featured, properly cached agent pipeline with zero external infrastructure. It's the fastest possible path from "I want to test this tool" to a working, resilient, observable local environment.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Teams building multi-agent systems at scale:&lt;/strong&gt; None of the core features changed. Request coalescing, semantic caching, circuit breaking — all still there, all still the core reason to use this. The stable release just means you can trust the foundation underneath them.&lt;/p&gt;




&lt;h2&gt;
  
  
  A note on the codebase itself
&lt;/h2&gt;

&lt;p&gt;For anyone who evaluates libraries by looking at the internals before adopting them — the caching subsystem was refactored into a clean modular package structure as part of this release. Each backend lives in its own module. The interface contracts are properly typed and pass mypy strict mode across all nine cache modules with zero errors. The test matrix covers each new backend with unit and integration tests.&lt;/p&gt;

&lt;p&gt;It's the kind of release that signals a project transitioning from "promising experiment" to "something you can actually build on." The internals match the ambitions.&lt;/p&gt;




&lt;h2&gt;
  
  
  Final thought
&lt;/h2&gt;

&lt;p&gt;The tooling layer for AI agents has been a mess for a long time — not because people weren't trying, but because the problem surface is broad and the solutions kept arriving piecemeal. Caching here, retry logic there, a circuit breaker you wrote yourself two projects ago and copy-paste ever since.&lt;/p&gt;

&lt;p&gt;ToolOps has been quietly assembling those pieces into a coherent whole. The stable release, and the database expansion that came with it, is the point where I'd say it's no longer a library you evaluate — it's a library you add to the stack and stop thinking about.&lt;/p&gt;

&lt;p&gt;That's the highest compliment I can give infrastructure.&lt;/p&gt;




&lt;p&gt;&lt;strong&gt;GitHub:&lt;/strong&gt; &lt;a href="https://github.com/hedimanai-pro/toolops" rel="noopener noreferrer"&gt;github.com/hedimanai-pro/toolops&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;em&gt;Happy to answer questions about specific integration patterns or use cases in the comments — particularly around multi-agent setups and high-volume pipelines.&lt;/em&gt;&lt;/p&gt;

</description>
      <category>ai</category>
      <category>webdev</category>
      <category>programming</category>
      <category>productivity</category>
    </item>
    <item>
      <title>ToolOps, The Night the Dashboard Turned Red</title>
      <dc:creator>Antoinette C. Lennox</dc:creator>
      <pubDate>Mon, 25 May 2026 08:23:36 +0000</pubDate>
      <link>https://dev.to/antoinette_clennox/toolops-the-night-the-dashboard-turned-red-397n</link>
      <guid>https://dev.to/antoinette_clennox/toolops-the-night-the-dashboard-turned-red-397n</guid>
      <description>&lt;p&gt;The alert came at 2:17 a.m.&lt;/p&gt;

&lt;p&gt;Marcus didn't hear it at first. He was already awake, sitting at the kitchen table in the blue light of his laptop, watching numbers refresh that he no longer wanted to see. Three months since launch. Forty thousand users. A waitlist that kept growing. By every measure that was supposed to matter, Aria — his AI-powered research assistant — was a success.&lt;/p&gt;

&lt;p&gt;The billing dashboard said otherwise.&lt;/p&gt;

&lt;p&gt;He'd built Aria to do what human researchers did, only faster. You asked her a question, she deployed a team of sub-agents — each one specialized, each one pulling from a different paid data source — and within seconds you had an answer that would have taken a junior analyst two hours to compile. The product was elegant. The demo converted. Investors had used words like inevitable.&lt;/p&gt;

&lt;p&gt;What investors don't model for, Marcus had learned, is what happens when something inevitable reaches ten thousand conversations in a single day.&lt;/p&gt;

&lt;p&gt;His phone buzzed. Then buzzed again. Then held a continuous, low vibration that meant the alert had escalated from warning to critical. He looked at the screen.&lt;/p&gt;

&lt;p&gt;API spend: $4,340. Today.&lt;/p&gt;

&lt;p&gt;He set the phone face-down on the table.&lt;/p&gt;

&lt;p&gt;The problem, he knew, wasn't that the system was broken. It was that the system was working exactly as designed. Every sub-agent was doing its job. Every tool call was legitimate. Somewhere inside those ten thousand daily conversations, the same searches were being fired independently, simultaneously, by agents that had no way of knowing another agent had asked the same question four seconds earlier. Three agents, three API calls, three invoices — for one piece of information that had already been retrieved.&lt;/p&gt;

&lt;p&gt;At scale, that math became its own kind of catastrophe.&lt;/p&gt;

&lt;p&gt;He'd tried to fix it himself, six weeks earlier. Stayed up three nights writing a custom cache layer, proud of the architecture, satisfied with the elegance of the solution. It held for eleven days. Then a memory leak he hadn't anticipated took down the entire pipeline at peak traffic, and he spent the following morning explaining to users why Aria had gone silent for four hours.&lt;/p&gt;

&lt;p&gt;The custom fix was now disabled. The billing clock was running again.&lt;/p&gt;

&lt;p&gt;At 3:05 a.m., he sent me a message. We'd worked together briefly the year before, on an earlier project that never launched. The message was two sentences.&lt;/p&gt;

&lt;p&gt;I think I've built something people actually want. I'm not sure I can afford to keep running it.&lt;/p&gt;

&lt;p&gt;I called him the next morning.&lt;/p&gt;

&lt;p&gt;He walked me through the architecture slowly, with the particular exhaustion of someone who has explained a problem so many times that the explanation itself has started to feel like the problem. The sub-agent network. The paid tool integrations. The volume. The redundancy he couldn't eliminate without building infrastructure he didn't have time to build.&lt;/p&gt;

&lt;p&gt;I let him finish. Then I asked him one question.&lt;/p&gt;

&lt;p&gt;"What's sitting between your agents and your APIs?"&lt;/p&gt;

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

&lt;p&gt;"Nothing," he said. "Just the calls."&lt;/p&gt;

&lt;p&gt;That was the problem. Not the product, not the model choices, not the architecture of the agents themselves. The layer between the business logic and the external world was empty — no caching, no coalescing, no circuit breaking, no shared memory. Every call landed cold. Every duplicate query cost real money as if it were the first time it had ever been asked.&lt;/p&gt;

&lt;p&gt;I told him about &lt;a href="https://github.com/hedimanai-pro/toolops" rel="noopener noreferrer"&gt;ToolOps&lt;/a&gt;. I'd been using it in my own work for a few months — a Python middleware SDK that wraps tool functions in a single decorator and handles the entire resilience layer automatically. Caching, retry logic, circuit breaking, and observability. For a multi-agent system like his, the critical feature was request coalescing: when multiple agents fire the same endpoint simultaneously, &lt;a href="https://github.com/hedimanai-pro/toolops" rel="noopener noreferrer"&gt;ToolOps&lt;/a&gt; executes the call once and distributes the result. Semantic caching meant that queries with identical intent but different phrasing — the kind a chatbot generates by the thousands — hit the same cache entry rather than triggering separate calls.&lt;/p&gt;

&lt;p&gt;He was quiet for a moment.&lt;/p&gt;

&lt;p&gt;"How long to integrate?"&lt;/p&gt;

&lt;p&gt;"A decorator per tool function," I said. "The agents don't change. The business logic doesn't change. You're wrapping the calls, not rewriting the system."&lt;/p&gt;

&lt;p&gt;We shipped the integration over a weekend.&lt;/p&gt;

&lt;p&gt;I remember watching Marcus go quiet on the call as the first full day of data came in. Not the anxious quiet of someone bracing for bad news. Something slower and more private — the particular stillness of a person watching a problem they'd carried for months simply stop.&lt;/p&gt;

&lt;p&gt;The duplicate calls that had been firing in parallel were coalescing into single upstream requests. The semantic cache was catching intent matches his exact-match logic had never seen. The circuit breaker — which he'd never had before — flagged one unreliable third-party endpoint that had been silently degrading his response quality for weeks, long before it showed up as an error.&lt;/p&gt;

&lt;p&gt;His spend that day was a fraction of what it had been.&lt;/p&gt;

&lt;p&gt;He didn't say much. He didn't need to. He took a screenshot of the dashboard — the same dashboard he'd been watching turn red every morning for three months — and sent it to me without a caption.&lt;/p&gt;

&lt;p&gt;The numbers were green.&lt;/p&gt;

&lt;p&gt;A few weeks later, over coffee, he told me what he'd done with the savings.&lt;/p&gt;

&lt;p&gt;Not pocketed them. Not used them to extend runway. He'd hired a front-end developer he'd been putting off, shipped a feature that had been sitting in the backlog since January, and started building an integration his enterprise users had been asking about since launch.&lt;/p&gt;

&lt;p&gt;The infrastructure efficiency hadn't just saved the product. It had funded the next version of it.&lt;/p&gt;

&lt;p&gt;He said something I've thought about since.&lt;/p&gt;

&lt;p&gt;"I kept thinking the problem was that we were growing too fast. But it wasn't that. The problem was that nothing was remembering anything."&lt;/p&gt;

&lt;p&gt;That's it, really. That's the whole lesson, told better than I could have told it.&lt;/p&gt;

&lt;p&gt;At scale, memory is money. And the systems that forget — the ones that fire every call cold, that treat every question as if it's never been asked before — pay for that forgetting, every single day, in ways that only show up when you're staring at a dashboard at 2 a.m. trying to understand how something this successful can feel this fragile.&lt;/p&gt;

&lt;p&gt;Aria is still running. Still growing. Still handling her ten thousand conversations a day.&lt;/p&gt;

&lt;p&gt;She just remembers now.&lt;/p&gt;

&lt;p&gt;GitHub: &lt;a href="https://github.com/hedimanai-pro/toolops" rel="noopener noreferrer"&gt;https://github.com/hedimanai-pro/toolops&lt;/a&gt;&lt;/p&gt;

</description>
      <category>ai</category>
      <category>webdev</category>
      <category>programming</category>
      <category>productivity</category>
    </item>
    <item>
      <title>ToolOps Saved My Client’s Startup. Here’s the Architecture Problem Nobody Talks About.</title>
      <dc:creator>Antoinette C. Lennox</dc:creator>
      <pubDate>Fri, 22 May 2026 07:17:14 +0000</pubDate>
      <link>https://dev.to/antoinette_clennox/toolops-saved-my-clients-startup-heres-the-architecture-problem-nobody-talks-about-4knh</link>
      <guid>https://dev.to/antoinette_clennox/toolops-saved-my-clients-startup-heres-the-architecture-problem-nobody-talks-about-4knh</guid>
      <description>&lt;p&gt;&lt;em&gt;A field report from the production layer.&lt;/em&gt;&lt;/p&gt;




&lt;p&gt;The call came at a bad time — or maybe exactly the right time.&lt;/p&gt;

&lt;p&gt;My client had built something that was actually working. An AI-powered chatbot handling web searches, pulling from multiple paid tool integrations, serving real users at real volume. The product was live. Users were engaged. By every surface metric, the startup was on track.&lt;/p&gt;

&lt;p&gt;Except the infrastructure was silently bleeding money.&lt;/p&gt;

&lt;p&gt;I've spent years helping teams build production-ready AI applications. I've seen the full range: systems that collapse under their first real traffic spike, systems that work beautifully at demo scale and become unmanageable at ten times that, and systems like my client's — architecturally sound, functionally impressive, and quietly unsustainable because of a single layer nobody had addressed.&lt;/p&gt;

&lt;p&gt;When we got on the call and he walked me through the numbers, it clicked immediately.&lt;/p&gt;




&lt;h2&gt;
  
  
  The Architecture Behind the Problem
&lt;/h2&gt;

&lt;p&gt;The system wasn't simple. It was never going to be simple — the product didn't allow for it.&lt;/p&gt;

&lt;p&gt;The chatbot operated through a network of sub-agents. Each conversation didn't trigger one process; it triggered a cascade. Each sub-agent had its own set of tools — search APIs, data services, third-party integrations — and every single one of those tools billed per call. The architecture was correct for the product requirements. But there was no shared intelligence between the agents. No layer that could recognize when the same query had already been answered sixty seconds ago. No mechanism to prevent three sub-agents in three parallel conversations from independently firing the same API call, paying three times for one piece of information.&lt;/p&gt;

&lt;p&gt;At 10,000 conversations a day, that redundancy compounds fast.&lt;/p&gt;

&lt;p&gt;Here's what makes this problem invisible until it isn't: every individual call looks justified. The sub-agent needed that data. The tool returned the right result. Nothing failed. The system log shows clean executions from top to bottom. The billing dashboard tells a different story — one that only becomes legible when you step back and look at the aggregate, at the patterns, at the sheer volume of duplicate intent spread across thousands of simultaneous conversations.&lt;/p&gt;

&lt;p&gt;This is the infrastructure problem nobody talks about, because it doesn't produce errors. It produces invoices.&lt;/p&gt;




&lt;h2&gt;
  
  
  The Standard Fix — And Why It Doesn't Scale
&lt;/h2&gt;

&lt;p&gt;Before I found a better solution, I would have approached this the way I'd always approached it: write a custom cache layer per tool.&lt;/p&gt;

&lt;p&gt;I've done it enough times to know the real cost of that approach. A proper cache implementation for a single tool — one that handles cache logic correctly, manages TTL, deals with edge cases, and doesn't introduce new failure modes — requires at minimum 20 lines of code. For a system with multiple paid tools spread across multiple sub-agents, you're writing that infrastructure over and over again, for every tool, maintained separately, tested separately, debugged separately.&lt;/p&gt;

&lt;p&gt;That's weeks of engineering time that produces no product value. It makes the system more complex. It gives you more surface area for failure. And it still doesn't solve the multi-agent problem cleanly, because hand-rolled cache layers don't naturally share state across independently running sub-agents.&lt;/p&gt;

&lt;p&gt;The deeper issue is philosophical: caching, retry logic, circuit breaking, and observability aren't features you bolt onto a production AI system after the fact. They're the foundation. But the tooling to implement that foundation properly hadn't existed in a form that was fast to integrate — until recently.&lt;/p&gt;




&lt;h2&gt;
  
  
  Why ToolOps Was the Right Call
&lt;/h2&gt;

&lt;p&gt;I'd been using &lt;a href="https://github.com/hedimanai-pro/toolops" rel="noopener noreferrer"&gt;ToolOps&lt;/a&gt; in my own work before this client came to me. It's a Python middleware SDK built specifically for AI agent infrastructure — it wraps any async function in a single decorator and handles caching, retry logic, circuit breaking, and observability automatically, without touching your business logic.&lt;/p&gt;

&lt;p&gt;For a multi-agent system running paid tools at high volume, the critical feature is request coalescing: when multiple agents call the same endpoint simultaneously, ToolOps executes the actual API call once and distributes the result across all callers. In a system handling thousands of daily conversations with overlapping query patterns — which is exactly what my client had — this collapses cascading duplicate calls into a fraction of the original volume.&lt;/p&gt;

&lt;p&gt;The semantic caching layer compounds the effect. Unlike exact-match caching, it recognizes intent rather than literal string matches. A chatbot fielding 10,000 conversations a day generates enormous natural language variety around a relatively finite set of underlying queries. Most caching systems miss that entirely. Semantic caching catches it.&lt;/p&gt;

&lt;p&gt;The integration required no architectural overhaul. One decorator per tool function:&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="nd"&gt;@readonly&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;cache_backend&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;semantic&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;cache_ttl&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="mi"&gt;3600&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;retry_count&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="mi"&gt;3&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="k"&gt;async&lt;/span&gt; &lt;span class="k"&gt;def&lt;/span&gt; &lt;span class="nf"&gt;run_tool&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;query&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nb"&gt;str&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="o"&gt;-&amp;gt;&lt;/span&gt; &lt;span class="nb"&gt;str&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
    &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="k"&gt;await&lt;/span&gt; &lt;span class="n"&gt;paid_tool&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;call&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;query&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Every tool in the system, wrapped. The sub-agents kept running exactly as before. The layer between them and the APIs changed everything.&lt;/p&gt;




&lt;h2&gt;
  
  
  What Actually Changed
&lt;/h2&gt;

&lt;p&gt;The cost reduction was significant — significant enough that my client didn't just stabilize the unit economics of his existing system. He had runway he hadn't had before.&lt;/p&gt;

&lt;p&gt;What he did with it matters more than the savings themselves: he reinvested directly into the product. Better capabilities. Improvements that had been on the roadmap for months, waiting for budget that kept getting consumed by infrastructure overhead. The efficiency gain at the tooling layer funded the next stage of the build.&lt;/p&gt;

&lt;p&gt;That's the outcome that's hard to explain to someone who hasn't seen it happen. Optimizing your token count gets you incremental savings on one line of the bill. Fixing the infrastructure layer changes what the business can do.&lt;/p&gt;

&lt;p&gt;There's something else that changed, quieter but just as real: the operational experience of running the system. Fewer unexpected spikes. A circuit breaker that detects failing endpoints and stops hammering them before the errors cascade. A single CLI command — &lt;code&gt;toolops doctor&lt;/code&gt; — that validates backend health and reports state without digging through logs. For a startup at this scale, that kind of operational clarity isn't a convenience. It's the difference between a system you can manage and one that manages you.&lt;/p&gt;




&lt;h2&gt;
  
  
  The Pattern I Keep Seeing
&lt;/h2&gt;

&lt;p&gt;This client's situation wasn't unusual. It's representative of a failure mode I encounter consistently in production AI systems: the product architecture is solid, the model selection is thoughtful, and the infrastructure layer — the one that sits between the business logic and the external world — is either missing entirely or stitched together from custom code that's grown beyond anyone's full understanding.&lt;/p&gt;

&lt;p&gt;The mistake isn't negligence. It's sequencing. You build the product first, which is correct. You defer the infrastructure, which is understandable. And then the system scales, and the infrastructure debt becomes the most expensive line on the bill.&lt;/p&gt;

&lt;p&gt;Multi-agent architectures make this worse by nature. Every agent you add multiplies the external call volume. Every paid tool you integrate adds another billing surface. The redundancy that's invisible at demo scale becomes structurally significant at production scale — not because anything broke, but because nothing in the system was built to recognize and eliminate it.&lt;/p&gt;

&lt;p&gt;The teams that will run efficiently at scale — as models get cheaper, as agent architectures grow more complex, as API-dependent products become the norm — are the ones who treat the infrastructure layer as a first-class concern from the beginning. Not an afterthought, not a future sprint, not something to fix when the bill becomes impossible to ignore.&lt;/p&gt;

&lt;p&gt;The caching layer is not a performance optimization. It's an architectural decision about how much of your operating cost you're willing to pay twice.&lt;/p&gt;




&lt;p&gt;&lt;em&gt;I work with teams building production AI systems and help them move from prototype to production-ready architecture. If this pattern sounds familiar in your own stack, I'd be glad to hear about it in the comments.&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;Stack: &lt;em&gt;ToolOps: &lt;a href="https://github.com/hedimanai-pro/toolops" rel="noopener noreferrer"&gt;github.com/hedimanai-pro/toolops&lt;/a&gt;&lt;/em&gt;&lt;/p&gt;

</description>
      <category>ai</category>
      <category>webdev</category>
      <category>programming</category>
      <category>productivity</category>
    </item>
    <item>
      <title>ToolOps: The Python Middleware That's Quietly Cutting AI Infrastructure Costs for Teams Running at Scale</title>
      <dc:creator>Antoinette C. Lennox</dc:creator>
      <pubDate>Wed, 20 May 2026 09:20:13 +0000</pubDate>
      <link>https://dev.to/antoinette_clennox/toolops-the-python-middleware-thats-quietly-cutting-ai-infrastructure-costs-for-teams-running-at-51no</link>
      <guid>https://dev.to/antoinette_clennox/toolops-the-python-middleware-thats-quietly-cutting-ai-infrastructure-costs-for-teams-running-at-51no</guid>
      <description>&lt;p&gt;There's a number most AI teams discover too late.&lt;/p&gt;

&lt;p&gt;It's not in the documentation. It's not in the LLM provider's pricing FAQ. It shows up on the bill — usually during a routine review, usually after a production deployment that "went well." According to CloudZero's research, average monthly AI spend jumped from $63,000 in 2024 to $85,500 in 2025 — a 36% increase. And for the teams that figure out what's actually driving that number, the culprit is almost never the model they chose. It's the calls they didn't need to make.&lt;/p&gt;

&lt;p&gt;This article is about a Python SDK called &lt;a href="https://github.com/hedimanai-pro/toolops" rel="noopener noreferrer"&gt;ToolOps&lt;/a&gt; that I started using a few months ago. I'm not affiliated with the project. I'm a developer who was burning through LLM credits faster than I should have been, tried a few solutions, and eventually found one that actually worked.&lt;/p&gt;




&lt;h2&gt;
  
  
  The Real Cost of Production AI Agents
&lt;/h2&gt;

&lt;p&gt;Token prices are falling. LLM API prices dropped approximately 80% between early 2025 and early 2026 — GPT-4o input pricing fell from $5.00 to $2.50 per million tokens, and newer models offer input at just $0.55/MTok. On paper, that sounds like great news for anyone building AI systems.&lt;/p&gt;

&lt;p&gt;In practice, it barely moves the needle if your architecture is inefficient.&lt;/p&gt;

&lt;p&gt;Here's why: each tool call in an agent adds the full message history back into the prompt. A 5-step agent with a 30,000-token system prompt can pay for that prompt five or more times per request. Now multiply that by concurrent agents, parallel pipelines, and repetitive queries that ask effectively the same thing in slightly different words. The token price per million is irrelevant. You're paying for the same computation over and over.&lt;/p&gt;

&lt;p&gt;The cheapest API call is the one you don't make. Efficient prompts, smart caching, and appropriate model selection matter more than provider choice. That principle sounds obvious until you're the one writing the infrastructure to enforce it — at which point you realize it's neither simple nor fast.&lt;/p&gt;




&lt;h2&gt;
  
  
  What Most Teams Do (And Why It Doesn't Scale)
&lt;/h2&gt;

&lt;p&gt;The standard approach to managing these costs involves writing custom infrastructure: a cache layer, retry logic, a circuit breaker for when APIs go down, observability hooks so you can debug what's happening, and concurrency controls to prevent 40 agents from hammering the same endpoint in parallel.&lt;/p&gt;

&lt;p&gt;Every piece of that is necessary. And every piece of it is code you write yourself, from scratch, for each project.&lt;/p&gt;

&lt;p&gt;When you build AI agents, external calls — LLMs, APIs, databases — are expensive, unreliable, and slow. &lt;a href="https://github.com/hedimanai-pro/toolops" rel="noopener noreferrer"&gt;ToolOps&lt;/a&gt; eliminates the boilerplate: it's a framework-agnostic middleware SDK that wraps any Python function in a single decorator, instantly upgrading it with caching, resilience, observability, and concurrency control.&lt;/p&gt;

&lt;p&gt;That's the pitch. Here's what it actually looks like in code.&lt;/p&gt;




&lt;h2&gt;
  
  
  One Decorator. Everything Else Is Handled.
&lt;/h2&gt;

&lt;p&gt;The before/after is stark.&lt;/p&gt;

&lt;p&gt;Before &lt;a href="https://github.com/hedimanai-pro/toolops" rel="noopener noreferrer"&gt;ToolOps&lt;/a&gt;, a properly resilient LLM tool call involves cache management, retry logic, circuit breaker state, timeout handling, and tracing — spread across dozens of lines of infrastructure code that wraps three lines of actual work.&lt;/p&gt;

&lt;p&gt;After:&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="nd"&gt;@readonly&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;cache_backend&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;semantic&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;cache_ttl&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="mi"&gt;3600&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;retry_count&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="mi"&gt;3&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="k"&gt;async&lt;/span&gt; &lt;span class="k"&gt;def&lt;/span&gt; &lt;span class="nf"&gt;ask_llm&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;query&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nb"&gt;str&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="o"&gt;-&amp;gt;&lt;/span&gt; &lt;span class="nb"&gt;str&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
    &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="k"&gt;await&lt;/span&gt; &lt;span class="n"&gt;llm&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;complete&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;query&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Automatically cached, retried, and traced. Every agent developer hits a wall when moving from demo to production — and that one decorator is what stands between a clean codebase and an unmaintainable nest of infrastructure scaffolding.&lt;/p&gt;

&lt;p&gt;The &lt;code&gt;@readonly&lt;/code&gt; decorator signals that this function is idempotent — safe to cache and retry. The &lt;code&gt;@readonly&lt;/code&gt; / &lt;code&gt;@sideeffect&lt;/code&gt; decorator split is opinionated in a good way: it forces you to be explicit about whether a tool call is idempotent or not, which matters a lot when deciding what's safe to cache and retry.&lt;/p&gt;




&lt;h2&gt;
  
  
  The Feature That Makes the Biggest Difference at Scale
&lt;/h2&gt;

&lt;p&gt;For teams running multi-agent systems — which is increasingly the default architecture for any serious AI workflow — there's one &lt;a href="https://github.com/hedimanai-pro/toolops" rel="noopener noreferrer"&gt;ToolOps&lt;/a&gt; feature that changes the economics of high-volume operations more than anything else.&lt;/p&gt;

&lt;p&gt;Request coalescing.&lt;/p&gt;

&lt;p&gt;If 50 agents call the same endpoint simultaneously, &lt;a href="https://github.com/hedimanai-pro/toolops" rel="noopener noreferrer"&gt;ToolOps&lt;/a&gt; executes the real API call once and multicasts the result.&lt;/p&gt;

&lt;p&gt;At first pass, this sounds like a minor optimization. It's not. In a production pipeline where multiple agents are processing similar inputs concurrently, this collapses what would be dozens of identical upstream requests into a single one. In a 50-concurrent-call benchmark, 50 calls collapsed to 1 upstream request — the thundering herd problem on cache miss is real, and this handles it cleanly.&lt;/p&gt;

&lt;p&gt;One request. One credit charge. One point of failure.&lt;/p&gt;

&lt;p&gt;For large-scale document processing, RAG pipelines, customer-facing AI products, or any architecture that handles bursty, repetitive loads — this is a structural cost reduction that no amount of model-switching will replicate.&lt;/p&gt;




&lt;h2&gt;
  
  
  Semantic Caching: Catching Costs That Exact-Match Misses
&lt;/h2&gt;

&lt;p&gt;Standard caching is binary: the input either matches a cached key or it doesn't. That works well for structured data. For natural language queries — which is most of what LLM-powered agents process — it misses an enormous opportunity.&lt;/p&gt;

&lt;p&gt;The semantic caching in &lt;a href="https://github.com/hedimanai-pro/toolops" rel="noopener noreferrer"&gt;ToolOps&lt;/a&gt; uses an intent-matching approach that's genuinely useful for NLP tool inputs. Queries like "Check status of invoice #442" and "Is invoice 442 paid?" hit the same cache entry, reducing LLM token usage noticeably.&lt;/p&gt;

&lt;p&gt;This matters more than it might seem. In customer support agents, document analysis pipelines, and data extraction workflows, users phrase the same underlying question dozens of different ways. Every variation that misses an exact-match cache is a redundant API call. Semantic caching eliminates that category of waste entirely.&lt;/p&gt;




&lt;h2&gt;
  
  
  Production-Grade Resilience Without the Ceremony
&lt;/h2&gt;

&lt;p&gt;Beyond cost reduction, there's the reliability side of production AI infrastructure.&lt;/p&gt;

&lt;p&gt;LLM APIs go down. External services rate-limit. Downstream databases return transient errors. The naive response is to let your agent fail. The correct response is a circuit breaker that detects consistent failures, temporarily halts calls to the affected service, and allows recovery — without you having to build that logic yourself.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://github.com/hedimanai-pro/toolops" rel="noopener noreferrer"&gt;ToolOps&lt;/a&gt; includes this out of the box. A single CLI command — &lt;code&gt;toolops doctor&lt;/code&gt; — validates all your backends and reports circuit breaker state. It's exactly what you want to wire into a health check endpoint.&lt;/p&gt;

&lt;p&gt;That kind of operational visibility — knowing the status of every backend, every circuit breaker, without digging through logs — is the difference between an agent that fails silently and one you can actually run in production with confidence.&lt;/p&gt;




&lt;h2&gt;
  
  
  Framework Compatibility: It Works With What You Already Use
&lt;/h2&gt;

&lt;p&gt;The natural concern when evaluating any new piece of infrastructure is migration cost. How much do I have to change?&lt;/p&gt;

&lt;p&gt;&lt;a href="https://github.com/hedimanai-pro/toolops" rel="noopener noreferrer"&gt;ToolOps&lt;/a&gt; decorates plain Python async functions, making it 100% compatible with your favorite agent frameworks. It works across LangGraph, CrewAI, LlamaIndex, and MCP natively.&lt;/p&gt;

&lt;p&gt;You don't rewrite your agents. You don't change your business logic. You add a decorator to the functions that make external calls and configure backends once at startup.&lt;/p&gt;

&lt;p&gt;You register backends once at application startup, then reference them by name. &lt;a href="https://github.com/hedimanai-pro/toolops" rel="noopener noreferrer"&gt;ToolOps&lt;/a&gt; supports multiple backends simultaneously. Redis for persistent caching, in-memory for low-latency hot paths, semantic backends for NLP tools — you configure the combination that fits your architecture. Then you stop thinking about it.&lt;/p&gt;

&lt;p&gt;The core package has zero external dependencies. You only install what you need. No forced opinions on your stack, no transitive dependency conflicts on day one, no bloat.&lt;/p&gt;




&lt;h2&gt;
  
  
  Who Benefits Most From This
&lt;/h2&gt;

&lt;p&gt;&lt;a href="https://github.com/hedimanai-pro/toolops" rel="noopener noreferrer"&gt;ToolOps&lt;/a&gt; is most valuable in three specific situations.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;High-volume production pipelines.&lt;/strong&gt; If your system makes thousands or tens of thousands of API calls per day, even modest cache hit rates translate to significant cost reductions. At scale, organizations can achieve cost reductions of 50% to 90% while maintaining or even improving the quality of their AI applications.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Multi-agent architectures.&lt;/strong&gt; The request coalescing feature was built for this. The more agents you run in parallel on overlapping workloads, the more redundant upstream calls you're generating without it.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Teams who've been hand-rolling infrastructure.&lt;/strong&gt; If your codebase currently has a custom retry wrapper, a homemade cache manager, and a circuit breaker you wrote yourself — that's infrastructure debt &lt;a href="https://github.com/hedimanai-pro/toolops" rel="noopener noreferrer"&gt;ToolOps&lt;/a&gt; replaces directly. The integration is one decorator per function, with zero changes to business logic.&lt;/p&gt;




&lt;h2&gt;
  
  
  Getting Started
&lt;/h2&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;pip &lt;span class="nb"&gt;install&lt;/span&gt; &lt;span class="s2"&gt;"toolops[all]"&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;From there, it's backend configuration at startup and decorator placement on your tool functions. The &lt;a href="https://github.com/hedimanai-pro/toolops" rel="noopener noreferrer"&gt;GitHub repository&lt;/a&gt; covers the full setup, and the &lt;a href="https://hedimanai.vercel.app/projects/toolops.html" rel="noopener noreferrer"&gt;official documentation&lt;/a&gt; walks through backend configuration and the decorator API in detail.&lt;/p&gt;

&lt;p&gt;The project is early — a web dashboard and budget control features are still on the roadmap — but the core resilience layer is solid. It's Apache 2.0 licensed. Open source, production-ready for its current feature set, actively developed.&lt;/p&gt;




&lt;h2&gt;
  
  
  The Architecture Principle It Enforces
&lt;/h2&gt;

&lt;p&gt;There's something more fundamental happening here than a useful library.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://github.com/hedimanai-pro/toolops" rel="noopener noreferrer"&gt;ToolOps&lt;/a&gt; is built on the idea that every external call an AI agent makes should be treated as a first-class operation — not an afterthought. Caching, retry logic, circuit breaking, observability, and concurrency control aren't optional production concerns you bolt on later. They're the minimum viable infrastructure for anything that talks to an LLM or an external API.&lt;/p&gt;

&lt;p&gt;Most teams know this. Most teams also don't have time to build it properly for every project. &lt;a href="https://github.com/hedimanai-pro/toolops" rel="noopener noreferrer"&gt;ToolOps&lt;/a&gt; packages that infrastructure into a decorator and gets out of the way.&lt;/p&gt;

&lt;p&gt;Don't over-optimize for today's prices. What matters is building the architecture that can take advantage of future pricing improvements. The teams that will operate efficiently as models get cheaper, as APIs multiply, as agent systems scale — are the ones who built the right plumbing early. &lt;a href="https://github.com/hedimanai-pro/toolops" rel="noopener noreferrer"&gt;ToolOps&lt;/a&gt; is that plumbing.&lt;/p&gt;




&lt;p&gt;&lt;em&gt;If you're building production AI agents and you've hit the credit-burn problem, I'd genuinely like to hear how you've handled it. Drop a comment below.&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;&lt;em&gt;GitHub: &lt;a href="https://github.com/hedimanai-pro/toolops" rel="noopener noreferrer"&gt;github.com/hedimanai-pro/toolops&lt;/a&gt;&lt;/em&gt;&lt;/p&gt;

</description>
      <category>ai</category>
      <category>python</category>
      <category>programming</category>
      <category>productivity</category>
    </item>
  </channel>
</rss>
