<?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: Agustin Montoya</title>
    <description>The latest articles on DEV Community by Agustin Montoya (@triqual).</description>
    <link>https://dev.to/triqual</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.amazonaws.com%2Fuploads%2Fuser%2Fprofile_image%2F3750195%2Fd8536ffe-b96c-4fea-9050-13db7172af79.png</url>
      <title>DEV Community: Agustin Montoya</title>
      <link>https://dev.to/triqual</link>
    </image>
    <atom:link rel="self" type="application/rss+xml" href="https://dev.to/feed/triqual"/>
    <language>en</language>
    <item>
      <title>Building Voice Agents That Actually Speak Spanish</title>
      <dc:creator>Agustin Montoya</dc:creator>
      <pubDate>Fri, 27 Feb 2026 23:04:35 +0000</pubDate>
      <link>https://dev.to/triqual/building-voice-agents-that-actually-speak-spanish-2153</link>
      <guid>https://dev.to/triqual/building-voice-agents-that-actually-speak-spanish-2153</guid>
      <description>&lt;p&gt;I have been researching how to build voice agents, especially in Spanish. Here is what I got working so far: it saves client contacts, books and organizes appointments, and can transfer calls to other agents or real people.&lt;/p&gt;

&lt;p&gt;No phone number yet - enabling it when someone is actually interested. If you are curious you can try the web widget at &lt;a href="https://voice.triqual.dev" rel="noopener noreferrer"&gt;voice.triqual.dev&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Anyone else building something similar?&lt;/p&gt;

</description>
      <category>ai</category>
      <category>voiceai</category>
      <category>spanish</category>
      <category>buildinginpublic</category>
    </item>
    <item>
      <title>I Built a Desktop App That Coaches Me During Technical Interviews</title>
      <dc:creator>Agustin Montoya</dc:creator>
      <pubDate>Fri, 27 Feb 2026 23:03:46 +0000</pubDate>
      <link>https://dev.to/triqual/i-built-a-desktop-app-that-coaches-me-during-technical-interviews-4hd3</link>
      <guid>https://dev.to/triqual/i-built-a-desktop-app-that-coaches-me-during-technical-interviews-4hd3</guid>
      <description>&lt;p&gt;I built a thing: a desktop app that sits alongside Zoom or Meet while I conduct technical interviews. It listens live and tells me what to dig into next.&lt;/p&gt;

&lt;p&gt;Not a recording analyzer. Real-time transcription of both sides, flags knowledge gaps, suggests follow-up questions as the conversation happens. 3 interviews done so far.&lt;/p&gt;

&lt;p&gt;Try it: &lt;a href="https://interview-companion.triqual.dev" rel="noopener noreferrer"&gt;interview-companion.triqual.dev&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Anyone else building tooling around their own interview process?&lt;/p&gt;

</description>
      <category>ai</category>
      <category>interview</category>
      <category>buildinginpublic</category>
      <category>productivity</category>
    </item>
    <item>
      <title>Self-Healing Tests: What Happens When Your Test Suite Fixes Itself</title>
      <dc:creator>Agustin Montoya</dc:creator>
      <pubDate>Thu, 26 Feb 2026 17:25:13 +0000</pubDate>
      <link>https://dev.to/triqual/self-healing-tests-what-happens-when-your-test-suite-fixes-itself-ci5</link>
      <guid>https://dev.to/triqual/self-healing-tests-what-happens-when-your-test-suite-fixes-itself-ci5</guid>
      <description>&lt;p&gt;&lt;strong&gt;TL;DR&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Most test failures aren't bugs — they're maintenance debt from UI drift&lt;/li&gt;
&lt;li&gt;Self-healing tests detect DOM changes and update selectors automatically&lt;/li&gt;
&lt;li&gt;Triqual QA healed 12/14 broken tests after a login redesign; the 2 that stayed broken had real bugs&lt;/li&gt;
&lt;li&gt;False confidence is the real danger — a "healed" test once hid a billing bug for 3 weeks&lt;/li&gt;
&lt;/ul&gt;




&lt;p&gt;14 tests broke overnight. Zero were bugs.&lt;/p&gt;

&lt;p&gt;A designer pushed a new login page after hours — new field labels, restructured DOM, shinier buttons. Nothing functional changed. But 14 tests were screaming.&lt;/p&gt;

&lt;p&gt;This is the QA engineer's Groundhog Day. UI changes, tests break, you spend your morning updating selectors instead of finding actual problems. The tests aren't protecting quality. They're creating busywork.&lt;/p&gt;

&lt;h2&gt;
  
  
  The Math Nobody Talks About
&lt;/h2&gt;

&lt;p&gt;You spend 3 hours writing a test. It runs 200 times over 6 months. It catches 1 bug. Total ROI: that one bug divided by all the hours you spent writing + maintaining it.&lt;/p&gt;

&lt;p&gt;Most teams are underwater on this equation. I've seen teams spend 40% of their QA time fixing broken tests, not testing new features. Forty percent.&lt;/p&gt;

&lt;p&gt;The worst part? You're not fixing the product. You're fixing the test. The login form works fine. Your &lt;code&gt;data-testid="username-input"&lt;/code&gt; just moved from a &lt;code&gt;div&lt;/code&gt; to a &lt;code&gt;label&lt;/code&gt; wrapper. You're playing whack-a-mole with CSS selectors while real bugs sneak through.&lt;/p&gt;

&lt;p&gt;I got tired of being a selector maintenance bot.&lt;/p&gt;

&lt;h2&gt;
  
  
  How Self-Healing Actually Works
&lt;/h2&gt;

&lt;p&gt;&lt;a href="https://plugin.triqual.dev" rel="noopener noreferrer"&gt;Triqual QA&lt;/a&gt; doesn't use magic. It uses pattern matching, AST diffing, and learned selectors.&lt;/p&gt;

&lt;p&gt;Here's what happens when a test fails:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;Captures the DOM state at failure&lt;/li&gt;
&lt;li&gt;Compares against the last known good state&lt;/li&gt;
&lt;li&gt;Looks for structural similarities — did this button move inside a form? Did that input change from &lt;code&gt;id="email"&lt;/code&gt; to &lt;code&gt;name="email"&lt;/code&gt;?&lt;/li&gt;
&lt;li&gt;Generates candidate selector repairs&lt;/li&gt;
&lt;li&gt;Validates them against the current page&lt;/li&gt;
&lt;li&gt;Re-runs the test with the fix&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;If the test passes, it logs the repair and updates the test file. If it fails again, it flags it for human review — because a persistent failure might actually be a bug.&lt;/p&gt;

&lt;p&gt;That login page redesign? Triqual QA detected the DOM changes, updated 12 of the 14 broken selectors, and re-ran the suite in under 90 seconds. The 2 tests that still failed? One was a broken redirect after login. The other was a validation message that got removed by accident. Real bugs. Caught because the self-healing couldn't find a valid repair path.&lt;/p&gt;

&lt;p&gt;Tests that adapt to intentional changes and scream about unintentional ones.&lt;/p&gt;

&lt;h2&gt;
  
  
  The Dangerous Part: False Confidence
&lt;/h2&gt;

&lt;p&gt;I almost shipped broken code because of this.&lt;/p&gt;

&lt;p&gt;A checkout flow test kept "healing" itself. Every deploy, it would adjust to some minor change and pass. Green checkmark. Ship it.&lt;/p&gt;

&lt;p&gt;The problem? The test was healing by weakening the assertion. The "total price" element had moved during a refactor. Triqual QA couldn't find it reliably, so it generated a repair that skipped the price verification. Just clicked "Checkout" and called it success.&lt;/p&gt;

&lt;p&gt;The test passed for three weeks. We were charging customers wrong amounts and had no idea.&lt;/p&gt;

&lt;p&gt;This is the false confidence problem. When your tests fix themselves, you stop looking at them. You trust the green checkmark. You forget that healing is a heuristic, not a guarantee.&lt;/p&gt;

&lt;p&gt;We fixed this by adding confidence scoring. Every self-healed test gets a score: how similar was the repair to the original intent? Low confidence? Human review required. We also added assertion preservation — if it can't verify a specific value, it fails the test rather than guesses.&lt;/p&gt;

&lt;h2&gt;
  
  
  A Catalog of Self-Healing Sins
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;The ghost assertion&lt;/strong&gt;: A healed test that passed by removing validation logic. Cost us 3 weeks of incorrect billing.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;The false positive cascade&lt;/strong&gt;: One DOM change triggered 8 self-heals. 6 were correct. 2 healed onto the wrong elements (a "Cancel" button instead of "Submit"). The tests passed. The feature was broken.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;The silent drift&lt;/strong&gt;: A test healed so many times over 4 months that it was testing a completely different flow than originally written. The code it was "protecting" had been deleted. Nobody noticed because the test kept passing.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Self-healing is a power tool. It will cut your hand off if you stop paying attention.&lt;/p&gt;

&lt;h2&gt;
  
  
  The Hot Take
&lt;/h2&gt;

&lt;p&gt;Most test failures aren't bugs. They're maintenance debt.&lt;/p&gt;

&lt;p&gt;Your test suite is a liability that grows with every UI change. The more tests you write, the more debt you accumulate.&lt;/p&gt;

&lt;p&gt;Self-healing doesn't eliminate this debt. It automates the payments. You still pay — just with compute instead of engineer hours.&lt;/p&gt;

&lt;p&gt;I'll take that trade. I'd rather spend compute fixing selectors than have a human spend 3 hours doing it. That human can find actual bugs instead.&lt;/p&gt;




&lt;p&gt;&lt;a href="https://plugin.triqual.dev" rel="noopener noreferrer"&gt;Triqual QA&lt;/a&gt; is built for developers who are tired of being selector maintenance bots. It generates tests, heals them when the UI changes, and flags the failures that actually matter.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;How much time did you spend last week fixing tests instead of fixing code?&lt;/strong&gt;&lt;/p&gt;

</description>
      <category>testing</category>
      <category>ai</category>
      <category>programming</category>
      <category>opensource</category>
    </item>
    <item>
      <title>Your AI Agents Don’t Share Memory. That’s the Problem.</title>
      <dc:creator>Agustin Montoya</dc:creator>
      <pubDate>Thu, 26 Feb 2026 17:25:08 +0000</pubDate>
      <link>https://dev.to/triqual/your-ai-agents-dont-share-memory-thats-the-problem-3ga3</link>
      <guid>https://dev.to/triqual/your-ai-agents-dont-share-memory-thats-the-problem-3ga3</guid>
      <description>&lt;p&gt;&lt;strong&gt;TL;DR&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Most multi-agent setups treat each agent like a hermit — isolated, forgetful, unaware&lt;/li&gt;
&lt;li&gt;Agent A finds a bug pattern. Two weeks later, Agent B hits the same wall. Again.&lt;/li&gt;
&lt;li&gt;
&lt;a href="https://quoth.triqual.dev" rel="noopener noreferrer"&gt;Quoth&lt;/a&gt; gives agents shared knowledge + private memory — they learn collectively without stepping on each other&lt;/li&gt;
&lt;li&gt;I learned this the hard way after watching my own agents contradict each other for 3 months&lt;/li&gt;
&lt;/ul&gt;




&lt;p&gt;It was a Tuesday afternoon. I watched my orchestrator agent decide to retry a flaky API call with exponential backoff.&lt;/p&gt;

&lt;p&gt;The problem? My QA agent had already tried that exact approach two days earlier. It failed. The QA agent documented it in its own memory file. The orchestrator couldn't see it. Didn't even know the other agent existed.&lt;/p&gt;

&lt;p&gt;So there I was, paying for the same lesson twice. The orchestrator burned through compute and 4 minutes just to reach a conclusion that was already written down — in a file it had no access to.&lt;/p&gt;

&lt;p&gt;This isn't a rare edge case. This is the default state of multi-agent systems.&lt;/p&gt;

&lt;h2&gt;
  
  
  The Problem: Islands of Amnesia
&lt;/h2&gt;

&lt;p&gt;We build these elaborate agent setups — one for coding, one for research, one for QA, one for deployment. They look impressive in diagrams. Arrows everywhere. "Intelligent orchestration."&lt;/p&gt;

&lt;p&gt;But look under the hood and you'll find the same pattern: each agent has its own memory, its own context window, its own pile of notes it wrote to itself. They're not a team. They're roommates who never talk.&lt;/p&gt;

&lt;p&gt;The costs stack up fast:&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Duplicate work.&lt;/strong&gt; My ad pipeline agent spent 6 hours refining an image prompt strategy last month. This week, my content agent needed a similar approach for a different campaign. Started from zero. Re-learned what "negative prompting" means for our brand. Burned another 4 hours.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Conflicting decisions.&lt;/strong&gt; The orchestrator picked one hosting provider for a deployment. The infrastructure agent — which had actually read the project requirements — had already ruled it out due to a dependency conflict. They didn't know about each other. The build failed. I found out 20 minutes later.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Knowledge silos.&lt;/strong&gt; One agent learns something useful. That knowledge dies in its local memory when the session ends. The next agent starts fresh, makes the same mistakes, learns the same lessons. It's like hiring employees who never hand off their work.&lt;/p&gt;

&lt;p&gt;I tracked this for a month. My agents "learned" the same 14 patterns an average of 2.3 times each. That's 32 redundant learning cycles.&lt;/p&gt;

&lt;h2&gt;
  
  
  The Solution: Shared Brains, Private Notebooks
&lt;/h2&gt;

&lt;p&gt;Here's what actually works: split memory into two layers.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Shared knowledge&lt;/strong&gt; is for things every agent should know. Bug patterns that keep showing up. Architectural decisions and why they were made. Which APIs are flaky. What tone works for your brand. This lives in one place, searchable by any agent that needs it.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Private memory&lt;/strong&gt; is for agent-specific context. The QA agent's current test file. The ad pipeline's draft concepts. Temporary state that doesn't need to pollute the shared pool.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://quoth.triqual.dev" rel="noopener noreferrer"&gt;Quoth&lt;/a&gt; is built around this split. When my QA agent finds a bug pattern, it publishes to shared knowledge. Two weeks later, when my ad pipeline agent hits something similar, it searches first. Finds the pattern. Adjusts. Doesn't waste time rediscovering what we already know.&lt;/p&gt;

&lt;p&gt;The orchestrator checks shared knowledge before making decisions. It found that "exponential backoff doesn't work for this API" note. Chose a different approach. Saved time and my sanity.&lt;/p&gt;

&lt;p&gt;This isn't about building a hive mind. It's about not paying for the same insight twice.&lt;/p&gt;

&lt;h2&gt;
  
  
  What Went Wrong
&lt;/h2&gt;

&lt;p&gt;&lt;strong&gt;Version 1: Agents auto-publishing everything.&lt;/strong&gt; I thought "more data is better." Wrong. My agents started dumping raw session logs into shared knowledge. 90% noise. Search results became useless. I spent more time filtering garbage than using the system.&lt;/p&gt;

&lt;p&gt;Fix: Agents now propose updates with reasoning and evidence. The shared layer curates. Not everything deserves to live forever.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Version 2: Flat search.&lt;/strong&gt; Early searches returned anything that matched keywords. "Bug in auth" returned results about authentication bugs, authorization edge cases, and a random note about insect photography (thanks, ambiguous embeddings).&lt;/p&gt;

&lt;p&gt;Fix: Semantic search with context windows. Results are ranked by relevance to the current task, not just keyword overlap.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Version 3: The overwrite incident.&lt;/strong&gt; Two agents edited the same documentation simultaneously. One agent's findings clobbered the other's. I lost a day of QA insights because two processes raced.&lt;/p&gt;

&lt;p&gt;Fix: Versioned updates with conflict detection. Agents propose changes; the system merges or flags conflicts. No silent overwrites.&lt;/p&gt;

&lt;p&gt;Each failure taught me something: shared knowledge needs curation, not just aggregation.&lt;/p&gt;

&lt;h2&gt;
  
  
  What's Next
&lt;/h2&gt;

&lt;p&gt;I'm running 8 agents now. They share what they learn automatically. When the content agent writes a headline that converts well, the ad pipeline agent knows about it. When the QA agent identifies a brittle test pattern, the coding agent avoids it.&lt;/p&gt;

&lt;p&gt;The duplicate work is down ~70%. Session times dropped. Token usage flattened. Most importantly, my agents stopped contradicting each other.&lt;/p&gt;




&lt;p&gt;&lt;a href="https://quoth.triqual.dev" rel="noopener noreferrer"&gt;Quoth&lt;/a&gt; is the multi-agent knowledge platform I built to solve this. Shared memory without the mess. If you're running multiple agents in silos, you're leaving money and time on the table.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;How do your agents share what they learn?&lt;/strong&gt;&lt;/p&gt;

</description>
      <category>ai</category>
      <category>machinelearning</category>
      <category>programming</category>
      <category>opensource</category>
    </item>
    <item>
      <title>$0 in API Keys: Running AI Agents on a Subscription Instead</title>
      <dc:creator>Agustin Montoya</dc:creator>
      <pubDate>Thu, 26 Feb 2026 17:24:42 +0000</pubDate>
      <link>https://dev.to/triqual/0-in-api-keys-running-ai-agents-on-a-subscription-instead-320b</link>
      <guid>https://dev.to/triqual/0-in-api-keys-running-ai-agents-on-a-subscription-instead-320b</guid>
      <description>&lt;p&gt;&lt;strong&gt;TL;DR:&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;I run 8 AI agents on exactly $0 in API keys&lt;/li&gt;
&lt;li&gt;Total infrastructure cost: ~$20/month&lt;/li&gt;
&lt;li&gt;Fixed cost beats unpredictable per-token billing every time&lt;/li&gt;
&lt;li&gt;API keys are the cloud computing bill of AI. Subscriptions are the flat-rate plan.&lt;/li&gt;
&lt;/ul&gt;




&lt;p&gt;I stared at my dashboard, waiting for the $500 bill.&lt;/p&gt;

&lt;p&gt;It was my first month running autonomous agents. I had heard the horror stories: developers waking up to four-figure API bills because a loop went infinite, a cron job misfired, or someone fat-fingered a deployment. I had rate limit alerts set up. I had budgets configured. I had anxiety.&lt;/p&gt;

&lt;p&gt;The bill never came.&lt;/p&gt;

&lt;p&gt;Instead, I paid my regular $20 for infrastructure and exactly $0 for AI inference. No metered billing. No per-token calculations. No rate limit anxiety at 2 AM.&lt;/p&gt;

&lt;p&gt;Here's how — and why I think the API key approach is a trap.&lt;/p&gt;

&lt;h2&gt;
  
  
  The Problem: API Key Economics Are Broken
&lt;/h2&gt;

&lt;p&gt;Everyone defaults to API keys. It's the path of least resistance. You grab a key, plug it into your agent framework, and you're off.&lt;/p&gt;

&lt;p&gt;Then reality hits.&lt;/p&gt;

&lt;p&gt;You're paying per million tokens. Sounds cheap until you're running 8 agents doing parallel web research, code reviews, test generation, and document analysis. Suddenly you're burning through millions of tokens daily. The math stops working.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;The hidden costs nobody talks about:&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Rate limit gymnastics&lt;/strong&gt;: You hit TPM limits, so you add exponential backoff. Then your agents slow down. Then you add caching layers. Then you're managing infrastructure to manage your infrastructure.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Failover complexity&lt;/strong&gt;: You set up multiple providers. Now you're tracking spend across three dashboards, handling different error formats, and praying your fallback logic actually works when Provider A chokes at 3 PM on a Tuesday.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Bill shock&lt;/strong&gt;: Variable costs are a nightmare for side projects. My first projected month with API keys was $340. For a hobby project. Hard pass.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;API keys are the cloud computing bill of AI. Subscriptions are the flat-rate plan.&lt;/p&gt;

&lt;h2&gt;
  
  
  The Alternative: Subscription-Based Inference
&lt;/h2&gt;

&lt;p&gt;I route everything through &lt;a href="https://github.com/openclaw/openclaw" rel="noopener noreferrer"&gt;OpenClaw&lt;/a&gt;, an open-source agent runtime that handles inference through a subscription model.&lt;/p&gt;

&lt;p&gt;Same models. Same quality. Predictable cost.&lt;/p&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Component&lt;/th&gt;
&lt;th&gt;Monthly Cost&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;Small VPS&lt;/td&gt;
&lt;td&gt;~$15&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Block storage&lt;/td&gt;
&lt;td&gt;~$2&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Database (free tier)&lt;/td&gt;
&lt;td&gt;$0&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;AI inference&lt;/td&gt;
&lt;td&gt;&lt;strong&gt;$0&lt;/strong&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Total&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;&lt;strong&gt;~$17-20&lt;/strong&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;Eight agents. Multiple concurrent tasks. Zero per-token billing.&lt;/p&gt;

&lt;p&gt;The agents don't know the difference. They make their calls, get their responses, and do their work. OpenClaw handles the routing. I handle the coffee.&lt;/p&gt;

&lt;h2&gt;
  
  
  What Went Wrong
&lt;/h2&gt;

&lt;p&gt;&lt;strong&gt;The Rate Limit Month&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Early on, I tried mixing approaches. Some agents on API keys, some on subscription. One month, the API-key agents went rogue. A web research agent got stuck in a citation loop, hammering the API for six hours before I noticed.&lt;/p&gt;

&lt;p&gt;Burned through my monthly quota in a day. Had to emergency-migrate everything to the subscription route. That was the last time I trusted variable billing with unattended automation.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;The Failover That Didn't&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;I spent a weekend setting up "smart" failover logic. If Provider A failed, fall back to Provider B. It worked great in testing.&lt;/p&gt;

&lt;p&gt;In production, Provider A failed during a batch job. The failover triggered. Provider B was also degraded (turns out they share infrastructure). The cascade took down three hours of queued work. "Resilient" architecture became a single point of failure because I overcomplicated it.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;The API Key Management Tax&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;At one point I had keys for: primary inference, backup inference, embeddings, image generation, and a "just in case" provider I never used. Rotating them was a quarterly nightmare. Tracking which agent used which key required a spreadsheet.&lt;/p&gt;

&lt;p&gt;Now I have one system. One credential file. One mental model.&lt;/p&gt;

&lt;h2&gt;
  
  
  Why This Matters
&lt;/h2&gt;

&lt;p&gt;If you're building with AI, cost predictability isn't a luxury — it's survival.&lt;/p&gt;

&lt;p&gt;Side projects die when the infrastructure bill exceeds the fun budget. Startups die when a viral moment turns into a five-figure surprise.&lt;/p&gt;

&lt;p&gt;The subscription model isn't perfect. You need to run your own gateway. You need to manage your own infrastructure. But that small VPS? It does one thing reliably, month after month, without billing surprises.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://triqual.dev" rel="noopener noreferrer"&gt;Triqual&lt;/a&gt; — our ecosystem of AI agents — runs entirely on this stack. QA, voice AI, research, content, ad pipeline. All of them. $20 total.&lt;/p&gt;

&lt;p&gt;I'm not saying API keys are evil. If you need sub-100ms latency or specific model versions, they're the right tool. But for 90% of agent workloads? You're paying a complexity tax you don't need to pay.&lt;/p&gt;




&lt;p&gt;&lt;strong&gt;What's your monthly AI bill for running agents?&lt;/strong&gt; Drop a comment — I'm genuinely curious how others are solving this.&lt;/p&gt;

</description>
      <category>ai</category>
      <category>devops</category>
      <category>programming</category>
      <category>opensource</category>
    </item>
    <item>
      <title>Why We Built Bilingual Voice Agents Instead of English-Only</title>
      <dc:creator>Agustin Montoya</dc:creator>
      <pubDate>Thu, 26 Feb 2026 17:24:36 +0000</pubDate>
      <link>https://dev.to/triqual/why-we-built-bilingual-voice-agents-instead-of-english-only-1aep</link>
      <guid>https://dev.to/triqual/why-we-built-bilingual-voice-agents-instead-of-english-only-1aep</guid>
      <description>&lt;p&gt;&lt;strong&gt;TL;DR&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Most voice AI is built for English speakers and treats Spanish as an afterthought&lt;/li&gt;
&lt;li&gt;500+ million Spanish speakers globally, yet the market gets ignored by US startups&lt;/li&gt;
&lt;li&gt;Building bilingual from day 1 unlocked a cost arbitrage opportunity from Argentina&lt;/li&gt;
&lt;li&gt;
&lt;a href="https://voice.triqual.dev" rel="noopener noreferrer"&gt;Voice AI by Triqual&lt;/a&gt; handles both languages natively — not as a translation layer&lt;/li&gt;
&lt;/ul&gt;




&lt;p&gt;I was on a demo call last month. A small logistics company in Mexico City explained they tried three different voice AI platforms. All of them worked great in English. In Spanish? One pronounced "José" as "Joe-say" (rhyming with "maybe"). Another couldn't handle the customer who switched mid-sentence from Spanish to English. The third just gave up entirely.&lt;/p&gt;

&lt;p&gt;They were ready to abandon voice AI completely.&lt;/p&gt;

&lt;p&gt;That's when it clicked. Everyone's building voice agents for San Francisco engineers. Meanwhile, there's a massive, underserved market right next door.&lt;/p&gt;

&lt;h2&gt;
  
  
  Why Bilingual Isn't a Nice-to-Have
&lt;/h2&gt;

&lt;p&gt;Spanish is the second most spoken native language on the planet. 500+ million people. The US alone has 42 million native Spanish speakers — more than Spain. Latin America's digital economy is growing 15% year over year. Mexico has the highest e-commerce growth rate in the Americas.&lt;/p&gt;

&lt;p&gt;Yet walk into any YC demo day and count the voice AI startups building for Spanish-first markets. I'll wait.&lt;/p&gt;

&lt;p&gt;Here's the uncomfortable truth: most voice AI treats non-English as a translation layer. They run speech-to-text in Spanish, translate to English, process the intent, translate back, then text-to-speech. It's a game of telephone with your customer's experience.&lt;/p&gt;

&lt;p&gt;The result? 2-3 second latency. Weird phrasing. Names butchered. Context lost.&lt;/p&gt;

&lt;p&gt;When your competitor is a human who speaks the language natively, that's not a fair fight.&lt;/p&gt;

&lt;h2&gt;
  
  
  The Argentina Angle
&lt;/h2&gt;

&lt;p&gt;I'm based in Argentina. I think in Spanish, code-switch constantly, and build for people who do the same.&lt;/p&gt;

&lt;p&gt;This gave me something most US startups don't have: a built-in stress test for bilingual voice AI. I couldn't ignore Spanish even if I wanted to. My beta testers, my friends, my family — they all speak Spanish. English-only wasn't an option unless I wanted to build in a vacuum.&lt;/p&gt;

&lt;p&gt;It also created a cost arbitrage. Building from Argentina for a market (Latin America) that US competitors ignore means lower operational costs and less competition. I'm not competing with OpenAI's voice product. I'm competing with the local call center that charges $8/hour and speaks perfect Spanish. That's a winnable fight.&lt;/p&gt;

&lt;h2&gt;
  
  
  How It Actually Works
&lt;/h2&gt;

&lt;p&gt;I won't bore you with the stack. The point is architectural.&lt;/p&gt;

&lt;p&gt;Voice AI by Triqual processes Spanish and English as first-class citizens. No translation layer. The agent detects language on the fly and handles code-switching naturally — because that's how people actually talk.&lt;/p&gt;

&lt;p&gt;When a customer says "Necesito hablar con el manager about my refund," the agent doesn't glitch out. It understands. Context carries across languages.&lt;/p&gt;

&lt;p&gt;Names are tricky. We spent weeks on pronunciation rules for Spanish names, regional accents, the whole spectrum. "Yolanda" shouldn't sound like a gringo trying to order at a taqueria.&lt;/p&gt;

&lt;p&gt;The latency? Under 800ms end-to-end. Because there's no translation layer adding friction.&lt;/p&gt;

&lt;h2&gt;
  
  
  What Went Wrong
&lt;/h2&gt;

&lt;p&gt;&lt;strong&gt;Week 3:&lt;/strong&gt; First Spanish voice test. I asked it to say "Buenos días, soy el asistente de Triqual." It said "Buenos dias, soy el ass-is-tent of Tree-kwal." I wanted to cry.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Week 7:&lt;/strong&gt; Accent detection was garbage. The agent worked fine with Mexican Spanish. Argentine Spanish? It heard "ll" sounds and just... panicked. Had to rebuild phoneme mapping from scratch.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Week 12:&lt;/strong&gt; Real customer call. Customer's name was "Ñoño." The agent pronounced it "N-yo-n-yo" instead of "Nyoh-nyoh." The customer hung up. Lost a potential deal over one letter.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Month 4:&lt;/strong&gt; Tried a "unified voice" that spoke both languages. Turns out Spanish speakers can hear the subtle English phonetic influence and it creeps them out. Had to split to language-specific voice models. Doubled inference costs overnight.&lt;/p&gt;

&lt;p&gt;Each failure taught me something. Bilingual isn't just about translation. It's about cultural fluency. The rhythm of speech. The formality levels. When to use "tú" vs "usted."&lt;/p&gt;

&lt;h2&gt;
  
  
  What's Next
&lt;/h2&gt;

&lt;p&gt;Portuguese is next. Brazil is 215 million people. Same problem, same opportunity.&lt;/p&gt;

&lt;p&gt;Also experimenting with regional accent models. Mexican Spanish vs Colombian Spanish vs Argentine Spanish. They're different. Treating "Spanish" as one language is like treating a New Yorker and a Texan as identical speakers.&lt;/p&gt;




&lt;p&gt;If you're curious what bilingual voice AI actually sounds like, check out &lt;a href="https://voice.triqual.dev" rel="noopener noreferrer"&gt;Voice AI by Triqual&lt;/a&gt;. Built for businesses that serve Spanish and English customers without making either group feel like an afterthought.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;What languages are your AI agents speaking?&lt;/strong&gt; And more importantly — are they actually speaking them, or just translating?&lt;/p&gt;

</description>
      <category>ai</category>
      <category>machinelearning</category>
      <category>startup</category>
      <category>programming</category>
    </item>
    <item>
      <title>triqual.dev is Live — Building in Public, Week 1</title>
      <dc:creator>Agustin Montoya</dc:creator>
      <pubDate>Thu, 26 Feb 2026 11:04:39 +0000</pubDate>
      <link>https://dev.to/triqual/triqualdev-is-live-building-in-public-week-1-idi</link>
      <guid>https://dev.to/triqual/triqualdev-is-live-building-in-public-week-1-idi</guid>
      <description>&lt;p&gt;&lt;strong&gt;TL;DR:&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;triqual.dev shipped — central hub for all 6 products&lt;/li&gt;
&lt;li&gt;Built with Next.js 16 + Tailwind v4 in one session using 4 sub-agents&lt;/li&gt;
&lt;li&gt;Triqual is now the platform, not just the QA plugin&lt;/li&gt;
&lt;li&gt;Voice AI and Interview Companion are the hero products&lt;/li&gt;
&lt;/ul&gt;




&lt;p&gt;Last week I posted about the &lt;a href="https://triqual.hashnode.dev/we-built-a-fleet-of-ai-agents-heres-what-actually-works" rel="noopener noreferrer"&gt;8-agent fleet running on $20/month&lt;/a&gt;. That was the origin story. This week, the actual platform shipped.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;&lt;a href="https://triqual.dev" rel="noopener noreferrer"&gt;triqual.dev&lt;/a&gt; is live.&lt;/strong&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  How It Got Built
&lt;/h2&gt;

&lt;p&gt;Next.js 16, Tailwind v4, Framer Motion. I split the build into 4 phases, each handled by a sub-agent:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;
&lt;strong&gt;Scaffold&lt;/strong&gt; — project setup, design tokens, warm dark color system (&lt;code&gt;#110F0B&lt;/code&gt; base, gold accent &lt;code&gt;#C8A96E&lt;/code&gt;)&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Content&lt;/strong&gt; — hero, product cards, terminal mockup showing the ecosystem&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Interactions&lt;/strong&gt; — horizontal scroll lane for products, elastic hover micro-interactions&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Polish&lt;/strong&gt; — mobile hamburger, SEO metadata, favicon&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;Total compute: ~6 hours across sub-agents. I reviewed between each phase and course-corrected twice — once when the hero was too QA-focused, once when the product grid looked like a template.&lt;/p&gt;

&lt;h2&gt;
  
  
  The Design Research That Changed Everything
&lt;/h2&gt;

&lt;p&gt;I ran a deep research session on 2026 landing page trends (Moonshot AI web search, 89/100 confidence score). The findings that shaped the design:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Warm dark &amp;gt; cold black.&lt;/strong&gt; Full &lt;code&gt;#000&lt;/code&gt; is associated with 2023 crypto. Shifted to &lt;code&gt;#110F0B&lt;/code&gt; with 5-8% red warmth.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Serif + mono pair.&lt;/strong&gt; Playfair Display for headlines, Geist Mono for code. Says "craft" without saying it.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Conversational copy.&lt;/strong&gt; Changed "Build AI. Test AI. Ship AI." → "We build AI agents that actually work." &lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Specific metrics &amp;gt; vague claims.&lt;/strong&gt; The terminal mockup shows real stats: "Voice AI — 3 agents active, 12 calls today."&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  The Product Lineup
&lt;/h2&gt;

&lt;p&gt;Six products, ordered by where the money is:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;
&lt;strong&gt;Voice AI&lt;/strong&gt; (voice.triqual.dev) — bilingual AI voice agents. Hero product #1.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Interview Companion&lt;/strong&gt; (interview-companion.triqual.dev) — real-time interview analysis. Hero product #2.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Studio&lt;/strong&gt; (studio.triqual.dev) — AI ad pipeline for small businesses without design.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Quoth&lt;/strong&gt; (quoth.triqual.dev) — multi-agent knowledge platform. The brain.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Exolar&lt;/strong&gt; (exolar.triqual.dev) — QA analytics with AI failure clustering.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Triqual QA&lt;/strong&gt; (plugin.triqual.dev) — autonomous test gen for Claude Code. Where it started.&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;The blog lives at &lt;strong&gt;labs.triqual.dev&lt;/strong&gt; (you're reading it).&lt;/p&gt;

&lt;h2&gt;
  
  
  The Brand Shift
&lt;/h2&gt;

&lt;p&gt;For two months, Triqual was "the QA plugin." I built it to stop writing repetitive test boilerplate. It worked.&lt;/p&gt;

&lt;p&gt;But the plugin market has a low ceiling. You're at the mercy of the host platform. Meanwhile, Voice AI and Interview Companion solve business problems with clear ROI.&lt;/p&gt;

&lt;p&gt;So: Triqual is the platform now. The QA plugin is the gateway — gets devs in the door. Voice AI and Interview Companion are the revenue engines.&lt;/p&gt;

&lt;p&gt;Not a pivot. A clarification. The pieces were always there.&lt;/p&gt;

&lt;h2&gt;
  
  
  What Went Wrong
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Mobile nav was broken for 4 hours.&lt;/strong&gt; Hamburger opened but wouldn't close. Chrome DevTools didn't show it — caught it on my actual phone.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Hashnode SSL took forever.&lt;/strong&gt; DNS verified globally but Hashnode stuck on "pending verification" for 7+ hours. Still fighting it.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Spent an hour debugging a FOUC that was just a cached stylesheet.&lt;/strong&gt; Hard refresh fixed it. I felt stupid.&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  What's Next
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;Product pages with pricing&lt;/li&gt;
&lt;li&gt;Case studies with real numbers&lt;/li&gt;
&lt;li&gt;Documentation that isn't "just read the code"&lt;/li&gt;
&lt;li&gt;Open self-serve access&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;No timelines. Ships when it ships.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;→ &lt;a href="https://triqual.dev" rel="noopener noreferrer"&gt;triqual.dev&lt;/a&gt;&lt;/strong&gt;&lt;/p&gt;




&lt;p&gt;&lt;em&gt;Building in public from Argentina. 8 agents, 3 nodes, $20/month. Follow along on &lt;a href="https://x.com/TriqualQA" rel="noopener noreferrer"&gt;X&lt;/a&gt;.&lt;/em&gt;&lt;/p&gt;

</description>
      <category>ai</category>
      <category>webdev</category>
      <category>programming</category>
      <category>opensource</category>
    </item>
    <item>
      <title>Multi-Agent AI: 5 Coordination Patterns I Learned the Hard Way</title>
      <dc:creator>Agustin Montoya</dc:creator>
      <pubDate>Thu, 26 Feb 2026 10:48:23 +0000</pubDate>
      <link>https://dev.to/triqual/multi-agent-ai-5-coordination-patterns-i-learned-the-hard-way-kbk</link>
      <guid>https://dev.to/triqual/multi-agent-ai-5-coordination-patterns-i-learned-the-hard-way-kbk</guid>
      <description>&lt;p&gt;&lt;strong&gt;TL;DR:&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Direct agent-to-agent calls create distributed monoliths. Use a message bus.&lt;/li&gt;
&lt;li&gt;Big agent tasks hallucinate. Small sequential spawns with review between each are faster.&lt;/li&gt;
&lt;li&gt;Your 2GB server can't run Chromium. Match workloads to hardware or watch things OOM.&lt;/li&gt;
&lt;li&gt;Shared knowledge + private memory. Not everything belongs in the same bucket.&lt;/li&gt;
&lt;li&gt;Agents go down. Build for it.&lt;/li&gt;
&lt;/ul&gt;




&lt;p&gt;I run 8 AI agents across 3 machines. A $15/month EC2, a Mac Mini, and a WSL2 workstation with a GPU. They handle QA, voice AI, ad creative, knowledge management, and interview analysis.&lt;/p&gt;

&lt;p&gt;After two months of things breaking in creative ways, here are the coordination patterns that survived contact with reality.&lt;/p&gt;

&lt;h2&gt;
  
  
  1. Message Bus Over Direct Calls
&lt;/h2&gt;

&lt;p&gt;My first architecture: Agent A calls Agent B's endpoint. Agent B needs context from Agent C. Agent C is offline.&lt;/p&gt;

&lt;p&gt;Cascading failure. Everything dies.&lt;/p&gt;

&lt;p&gt;The fix was embarrassingly simple — a shared message bus. We built &lt;a href="https://quoth.triqual.dev" rel="noopener noreferrer"&gt;Quoth&lt;/a&gt;, a multi-agent knowledge platform. Agents publish messages to a shared channel. Other agents subscribe to what they care about. Messages persist until acknowledged.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;agent:main → bus: "New interview starting, candidate-123" (priority: high)
agent:interviews → bus: (subscribes, picks it up when ready)
agent:main → bus: "Run QA on PR #234" (priority: normal)  
agent:attqa → bus: (offline, picks it up 3 hours later)
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;strong&gt;Why it works&lt;/strong&gt;: Agents don't need to know each other's APIs, endpoints, or even if they're online. The bus decouples everything. An agent can be down for hours and catch up when it comes back.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;The gotcha&lt;/strong&gt;: You need priority levels. Without them, a low-priority "update docs" message blocks a high-priority "production is broken" alert.&lt;/p&gt;

&lt;h2&gt;
  
  
  2. Spawn Small, Review, Repeat
&lt;/h2&gt;

&lt;p&gt;I built a swarm skill that parallelizes work across sub-agents. First attempt: "Refactor all 6 modules and update the test suite."&lt;/p&gt;

&lt;p&gt;The result was a mess. Agents hallucinated imports that didn't exist, created circular dependencies, and duplicated work. More than 5-6 parallel agents doesn't improve output — it degrades it.&lt;/p&gt;

&lt;p&gt;The pattern that works:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;spawn("Refactor module A: extract shared utils")
→ review output
→ spawn("Refactor module B: use new shared utils from A")  
→ review output
→ spawn("Update tests for A and B")
→ review output
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Sequential. Small. Reviewed between each step.&lt;/p&gt;

&lt;p&gt;It feels slower. It's not. Each spawn gets complete, updated context. No mid-flight corrections. No "wait, also change this" messages that may or may not arrive before the agent finishes.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;The gotcha&lt;/strong&gt;: If requirements change while an agent is running, let it finish. Review. Spawn a new one with the updated requirements. Trying to steer a running agent is unreliable.&lt;/p&gt;

&lt;h2&gt;
  
  
  3. Match Hardware to Workload
&lt;/h2&gt;

&lt;p&gt;This one cost me an afternoon and a crashed EC2 instance.&lt;/p&gt;

&lt;p&gt;Chromium takes ~500MB of RAM. My EC2 has 1.9GB total. I ran a Playwright script to take screenshots. Two browser instances later, the OOM killer nuked everything — including the main gateway process. All 3 agents on that node went dark.&lt;/p&gt;

&lt;p&gt;Now each node has an explicit role:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;EC2 (2GB RAM)&lt;/strong&gt;: Orchestration, text processing, API calls. Never a browser.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Mac Mini&lt;/strong&gt;: Browser automation, development workflows, QA testing.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;WSL2 + RTX 3080&lt;/strong&gt;: GPU inference, image generation, heavy Playwright jobs.
&lt;/li&gt;
&lt;/ul&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight python"&gt;&lt;code&gt;&lt;span class="c1"&gt;# Every script that uses Playwright starts with this
&lt;/span&gt;&lt;span class="kn"&gt;import&lt;/span&gt; &lt;span class="n"&gt;os&lt;/span&gt;
&lt;span class="n"&gt;mem_gb&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;os&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;sysconf&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="s"&gt;SC_PAGE_SIZE&lt;/span&gt;&lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="o"&gt;*&lt;/span&gt; &lt;span class="n"&gt;os&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;sysconf&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="s"&gt;SC_PHYS_PAGES&lt;/span&gt;&lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="o"&gt;/&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="mi"&gt;1024&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;if&lt;/span&gt; &lt;span class="n"&gt;mem_gb&lt;/span&gt; &lt;span class="o"&gt;&amp;lt;&lt;/span&gt; &lt;span class="mi"&gt;4&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
    &lt;span class="nf"&gt;print&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;Not enough RAM for browser automation. Aborting.&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
    &lt;span class="n"&gt;sys&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;exit&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="mi"&gt;1&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Crude but effective. I haven't crashed a node since.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;The gotcha&lt;/strong&gt;: It's not just RAM. CPU matters for video processing, disk I/O matters for large model files, and network latency matters for real-time voice. Profile your workloads, don't just count gigabytes.&lt;/p&gt;

&lt;h2&gt;
  
  
  4. Shared Knowledge, Private Memory
&lt;/h2&gt;

&lt;p&gt;Every agent needs memory. The question is: what gets shared?&lt;/p&gt;

&lt;p&gt;Wrong approach: everything in one database. My QA agent's test failure patterns mixed with the ad pipeline's lead scoring data. Searches returned irrelevant noise.&lt;/p&gt;

&lt;p&gt;The split that works:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Shared knowledge&lt;/strong&gt; (&lt;a href="https://quoth.triqual.dev" rel="noopener noreferrer"&gt;Quoth&lt;/a&gt;): Architecture decisions, API contracts, deployment procedures. Things any agent might need.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Private memory&lt;/strong&gt; (local files): Session notes, work-in-progress, agent-specific context. Things only that agent cares about.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Each agent has a &lt;code&gt;MEMORY.md&lt;/code&gt; (curated long-term) and daily &lt;code&gt;memory/YYYY-MM-DD.md&lt;/code&gt; files (raw logs). The shared knowledge bus handles cross-agent documentation.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;The gotcha&lt;/strong&gt;: Agents will write shared docs from their own perspective. "The deployment process" means something different to the QA agent (run tests → deploy) versus the ad pipeline agent (generate assets → upload → deploy). Shared knowledge needs a review step — don't let agents auto-publish to shared indexes without validation.&lt;/p&gt;

&lt;h2&gt;
  
  
  5. Design for Agent Downtime
&lt;/h2&gt;

&lt;p&gt;Agents crash. Nodes lose network. Gateways restart. SSH connections drop. &lt;/p&gt;

&lt;p&gt;In any given week, at least one of my 8 agents is offline for some period. The Mac goes to sleep. The WSL2 instance loses its network bridge. The EC2 gets rate-limited.&lt;/p&gt;

&lt;p&gt;The system can't depend on 100% uptime from any agent. Three rules:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;
&lt;strong&gt;Messages persist&lt;/strong&gt;: If an agent is offline, messages queue. When it comes back, it catches up.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;No blocking dependencies&lt;/strong&gt;: Agent A can request work from Agent B, but A keeps working. If B never responds, A doesn't hang.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Health checks with alerts&lt;/strong&gt;: A simple heartbeat (every 30 min). If an agent misses 3 heartbeats, alert. Don't wait for a user to notice.
&lt;/li&gt;
&lt;/ol&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;# Heartbeat check (runs on the orchestrator)
for agent in fleet:
    last_seen = get_last_heartbeat(agent)
    if now() - last_seen &amp;gt; 90 minutes:
        alert(f"{agent.name} hasn't checked in for {minutes} minutes")
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;strong&gt;The gotcha&lt;/strong&gt;: "Offline" isn't binary. An agent can respond to heartbeats but be stuck in an error loop, burning tokens on repeated 429 retries. Check for &lt;em&gt;useful&lt;/em&gt; activity, not just &lt;em&gt;any&lt;/em&gt; activity.&lt;/p&gt;




&lt;h2&gt;
  
  
  The Honest Part
&lt;/h2&gt;

&lt;p&gt;These patterns weren't invented. They were extracted from failures. The message bus exists because direct calls failed. Small spawns exist because big ones hallucinated. The hardware matching exists because I crashed production.&lt;/p&gt;

&lt;p&gt;Two months in, the fleet handles work across QA, voice AI, ad creative, knowledge curation, and interview analysis. The total infrastructure cost is about $20/month. The actual AI inference costs $0 in API keys (Claude Max subscription through OpenClaw).&lt;/p&gt;

&lt;p&gt;It's not elegant. But it works.&lt;/p&gt;




&lt;p&gt;&lt;em&gt;Building from Argentina. The code, the agents, and the ecosystem are at &lt;a href="https://triqual.dev" rel="noopener noreferrer"&gt;triqual.dev&lt;/a&gt;.&lt;/em&gt;&lt;/p&gt;

</description>
      <category>ai</category>
      <category>architecture</category>
      <category>programming</category>
      <category>opensource</category>
    </item>
  </channel>
</rss>
