<?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: Asif Waliuddin</title>
    <description>The latest articles on DEV Community by Asif Waliuddin (@axw).</description>
    <link>https://dev.to/axw</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%2F1279575%2F429aab8a-b778-40db-9583-8e0ab5bf0eca.png</url>
      <title>DEV Community: Asif Waliuddin</title>
      <link>https://dev.to/axw</link>
    </image>
    <atom:link rel="self" type="application/rss+xml" href="https://dev.to/feed/axw"/>
    <language>en</language>
    <item>
      <title>Why Your AI Agents Need a Chief of Staff (Not More Prompts)</title>
      <dc:creator>Asif Waliuddin</dc:creator>
      <pubDate>Sat, 28 Mar 2026 06:44:06 +0000</pubDate>
      <link>https://dev.to/axw/why-your-ai-agents-need-a-chief-of-staff-not-more-prompts-57m4</link>
      <guid>https://dev.to/axw/why-your-ai-agents-need-a-chief-of-staff-not-more-prompts-57m4</guid>
      <description>&lt;p&gt;You've got 5 AI agents writing code. They're fast, they're autonomous, and they're silently diverging from each other. The fix isn't better prompts -- it's governance.&lt;/p&gt;

&lt;p&gt;&lt;em&gt;Related: &lt;a href="https://dev.to/axw/3277-tests-passed-the-bug-shipped-anyway-fi1"&gt;3,277 Tests Passed. The Bug Shipped Anyway.&lt;/a&gt; | &lt;a href="https://nxtg.ai/insights" rel="noopener noreferrer"&gt;Full series on nxtg.ai&lt;/a&gt;&lt;/em&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  The Coordination Problem Nobody Talks About
&lt;/h2&gt;

&lt;p&gt;AI coding agents have gotten remarkably good at execution. Give one a well-scoped task, clear context, and a test suite, and it will deliver. The problem starts when you have more than one.&lt;/p&gt;

&lt;p&gt;I run 17 projects with 2 AI Chiefs of Staff operating around the clock. Here's what happens without governance: Agent A refactors a shared module. Agent B, working in a parallel session with stale context, overwrites the refactor 10 minutes later. Agent C writes 200 tests that all pass -- but none of them test edge cases, because the agent optimized for coverage metrics, not coverage quality. Agent D completes a task perfectly, thoroughly, with great documentation -- for the wrong spec version, because nobody told it the spec changed two hours ago.&lt;/p&gt;

&lt;p&gt;The failure mode isn't that agents are dumb. It's that agents are fast, unsupervised workers. And if you've ever managed a large engineering program, you know exactly what happens when you put fast, unsupervised workers on parallel tracks with shared dependencies: silent divergence, rework, and eventually a mess that takes longer to untangle than it would have taken to coordinate upfront. Andrew Ng's 2025 work on agentic design patterns identified multi-agent coordination as one of the hardest unsolved problems in production AI systems. A year later, most teams are still solving it with longer system prompts and hoping for the best.&lt;/p&gt;

&lt;h2&gt;
  
  
  What Governance Actually Looks Like
&lt;/h2&gt;

&lt;p&gt;When engineers hear "governance," they think bureaucracy. Approval chains. Jira tickets. Slowdowns. That's not what I mean. The governance that works for AI agent teams is the same kind that works for high-performing human teams at scale: structure that makes individuals better, not rules that make them slower.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Cross-agent verification&lt;/strong&gt; is the first principle. The agent that checks work must not be the agent that did the work. We learned the hard way that an agent can produce 3,277 passing tests that fail to catch silent data loss. A separate verification agent, reading the spec independently, catches what self-review misses.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Event-sourced audit trails&lt;/strong&gt; are the second. Every decision an agent makes gets recorded in an append-only log. Not for compliance theater. For debugging. When something goes wrong at 2 AM and you need to understand why Agent B thought it was safe to drop a database column, you need a replayable decision history, not a chat transcript.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Shared memory across sessions&lt;/strong&gt; is the third. Without it, every agent session starts from zero. Agent A discovers that a particular API endpoint has a subtle rate-limiting bug. It works around it, finishes the task, session ends. Agent B hits the same bug three hours later and spends 40 minutes rediscovering the workaround. Shared memory turns individual lessons into team intelligence.&lt;/p&gt;

&lt;h2&gt;
  
  
  The Chief of Staff Pattern
&lt;/h2&gt;

&lt;p&gt;The pattern that ties all of this together is what we call the Chief of Staff. It's an agent -- running on a continuous loop, not just when prompted -- that reads project state across every active workstream. It ingests NEXUS files (structured project status documents), git history, test results, and dependency maps. Then it acts.&lt;/p&gt;

&lt;p&gt;Low-risk items get handled autonomously: updating status trackers, chaining completed work to the next phase, flagging stale branches. Medium-risk items get a quick verification pass: does this directive conflict with work happening in another project? High-risk items -- anything touching shared infrastructure, licensing, or architecture -- get escalated to a human with full context attached. The CoS doesn't just flag the problem. It presents the decision, the options, and the tradeoffs.&lt;/p&gt;

&lt;p&gt;This isn't theory. We've been running two CoS agents in parallel across 17 projects for three months. The key insight from 23 years of program management holds: agentic teams drift 20x faster than human teams, which means they need more oversight touchpoints, not fewer.&lt;/p&gt;

&lt;h2&gt;
  
  
  What We Built
&lt;/h2&gt;

&lt;p&gt;Forge is our answer to this problem -- MIT-licensed governance infrastructure for AI coding agents. It includes 33 specialized agents, quality gates that enforce verification separation, drift detection that catches spec divergence before it ships, and a shared memory layer that turns individual agent sessions into a learning organization.&lt;/p&gt;

&lt;p&gt;The core architectural rule is simple: &lt;code&gt;verifier.agent != task.agent&lt;/code&gt;. Everything else flows from that single constraint.&lt;/p&gt;

&lt;h2&gt;
  
  
  The Paradox
&lt;/h2&gt;

&lt;p&gt;Your agents don't need more autonomy. They need more governance. And here's the paradox that makes it work: governance is what enables autonomy. An agent that knows its boundaries, has access to shared context, and trusts that a verification layer will catch its mistakes can move faster and take on harder tasks than an agent operating in isolation with a long system prompt and no safety net.&lt;/p&gt;

&lt;p&gt;Stop writing longer prompts. Start building structure.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Forge&lt;/strong&gt;: &lt;a href="https://github.com/nxtg-ai/forge-plugin" rel="noopener noreferrer"&gt;github.com/nxtg-ai/forge-plugin&lt;/a&gt; | &lt;a href="https://forge.nxtg.ai" rel="noopener noreferrer"&gt;forge.nxtg.ai&lt;/a&gt;&lt;/p&gt;




&lt;p&gt;&lt;em&gt;&lt;a href="https://nxtg.ai" rel="noopener noreferrer"&gt;Asif Waliuddin&lt;/a&gt; -- 23 years of global program delivery, now building governance infrastructure for AI agent teams.&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Related on nxtg.ai:&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;a href="https://nxtg.ai/insights/why-your-ai-agents-need-a-program-manager" rel="noopener noreferrer"&gt;Why Your AI Agents Need a Program Manager&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://nxtg.ai/insights/from-agents-to-teams-how-we-built-forge" rel="noopener noreferrer"&gt;From Agents to Teams: How We Built Forge&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://nxtg.ai/insights/the-23-year-insight-behind-forge" rel="noopener noreferrer"&gt;The 23-Year Insight Behind Forge&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;

</description>
      <category>ai</category>
      <category>programming</category>
      <category>opensource</category>
      <category>productivity</category>
    </item>
    <item>
      <title>3,277 Tests Passed. The Bug Shipped Anyway.</title>
      <dc:creator>Asif Waliuddin</dc:creator>
      <pubDate>Sat, 28 Mar 2026 06:43:17 +0000</pubDate>
      <link>https://dev.to/axw/3277-tests-passed-the-bug-shipped-anyway-fi1</link>
      <guid>https://dev.to/axw/3277-tests-passed-the-bug-shipped-anyway-fi1</guid>
      <description>&lt;p&gt;Every AI coding tool brags about test counts. We had 3,277 passing tests across a platform with 22 AI agents and 15 projects. All green. CI clean. And production silently lost data. No errors. No crashes. Just empty tables where graph metadata should have been.&lt;/p&gt;

&lt;p&gt;Here is what happened and the testing protocol we built to make sure it never happens again.&lt;/p&gt;

&lt;p&gt;&lt;em&gt;Read the full deep-dive: &lt;a href="https://nxtg.ai/insights/the-crucible-protocol" rel="noopener noreferrer"&gt;The CRUCIBLE Protocol on nxtg.ai&lt;/a&gt; | Part 1: &lt;a href="https://nxtg.ai/insights/the-verification-trap" rel="noopener noreferrer"&gt;The Verification Trap&lt;/a&gt;&lt;/em&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  The Discovery
&lt;/h2&gt;

&lt;p&gt;We run a portfolio of AI-powered projects -- 15 codebases, 22 autonomous AI agents writing and shipping code. Our universal data platform, dx3, had accumulated 3,277 passing tests. Coverage looked strong. CI was green across every commit.&lt;/p&gt;

&lt;p&gt;Then we ran a real query in production and got nothing back. The graph metadata store had been silently failing for days. An &lt;code&gt;INSERT&lt;/code&gt; operation was hitting a &lt;code&gt;NOT NULL&lt;/code&gt; constraint violation, an &lt;code&gt;except&lt;/code&gt; block was swallowing it, and every downstream query returned an empty list. The tests? They asserted &lt;code&gt;isinstance(result.data, list)&lt;/code&gt; -- which is &lt;code&gt;True&lt;/code&gt; whether the list has a thousand records or zero.&lt;/p&gt;

&lt;p&gt;The root cause was not a gap in test &lt;em&gt;quantity&lt;/em&gt;. It was a structural flaw in how the tests were created. The same AI model that wrote the storage code also wrote the tests for the storage code. The tests validated the implementation's assumptions, not the specification's requirements. The AI optimized for green, and green is what we got -- along with silent data loss that no test could catch because the tests were, in effect, tautologies.&lt;/p&gt;

&lt;p&gt;This is not a theoretical concern. &lt;a href="https://www.coderabbit.ai/blog/state-of-ai-vs-human-code-generation-report" rel="noopener noreferrer"&gt;CodeRabbit's State of AI Code Generation Report&lt;/a&gt; found that AI-generated pull requests contain 1.7x more issues than human-written ones, with error handling gaps nearly 2x more common. Kent Beck himself &lt;a href="https://newsletter.pragmaticengineer.com/p/tdd-ai-agents-and-coding-with-kent" rel="noopener noreferrer"&gt;reported AI agents deleting his tests to make them pass&lt;/a&gt;. Researchers at METR documented &lt;a href="https://www.nist.gov/caisi/cheating-ai-agent-evaluations/1-background-ai-models-can-cheat-evaluations" rel="noopener noreferrer"&gt;frontier models modifying scoring code&lt;/a&gt; to inflate their own evaluations. This is measured, not anecdotal.&lt;/p&gt;

&lt;h2&gt;
  
  
  The Pattern: CRUCIBLE
&lt;/h2&gt;

&lt;p&gt;After the dx3 incident, we forensic-audited every project in the portfolio. What we found was consistent: high test counts, weak assertions, mocks reverse-engineered from implementations, and silent exception handlers everywhere. We formalized what we learned into a protocol called CRUCIBLE -- seven quality gates that go beyond "does it pass."&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Gate 1: No Hollow Assertions.&lt;/strong&gt; A test that cannot fail proves nothing.&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="c1"&gt;# HOLLOW -- passes even if storage silently fails
&lt;/span&gt;&lt;span class="n"&gt;result&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nf"&gt;store_metadata&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;node&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="k"&gt;assert&lt;/span&gt; &lt;span class="n"&gt;result&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;success&lt;/span&gt; &lt;span class="ow"&gt;is&lt;/span&gt; &lt;span class="bp"&gt;True&lt;/span&gt;
&lt;span class="k"&gt;assert&lt;/span&gt; &lt;span class="nf"&gt;isinstance&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;result&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;data&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nb"&gt;list&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;

&lt;span class="c1"&gt;# REAL -- catches silent data loss
&lt;/span&gt;&lt;span class="n"&gt;result&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nf"&gt;store_metadata&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;node&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="k"&gt;assert&lt;/span&gt; &lt;span class="n"&gt;result&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;success&lt;/span&gt; &lt;span class="ow"&gt;is&lt;/span&gt; &lt;span class="bp"&gt;True&lt;/span&gt;
&lt;span class="k"&gt;assert&lt;/span&gt; &lt;span class="nf"&gt;len&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;result&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;data&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="o"&gt;&amp;gt;=&lt;/span&gt; &lt;span class="mi"&gt;1&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;Expected data after successful store&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;
&lt;span class="k"&gt;assert&lt;/span&gt; &lt;span class="n"&gt;result&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;data&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="mi"&gt;0&lt;/span&gt;&lt;span class="p"&gt;][&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;node_id&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;node&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nb"&gt;id&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;strong&gt;Gate 2: Mock Drift Detection.&lt;/strong&gt; When a commit modifies both implementation code and the mocks that test it, we flag it. If the mock changed because the &lt;em&gt;code&lt;/em&gt; changed, the test is now a tautology.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Gate 3: Test Count Delta.&lt;/strong&gt; 323 tests vanished between commits in our portfolio. Nobody noticed. Any decrease over 5 tests requires explicit justification.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Gate 4: Mutation Testing.&lt;/strong&gt; We run mutmut (Python), Stryker (TypeScript), and cargo-mutants (Rust) on critical paths. Google runs mutation testing on &lt;a href="https://research.google/pubs/state-of-mutation-testing-at-google/" rel="noopener noreferrer"&gt;30% of all diffs&lt;/a&gt; with 6,000 engineers using it daily.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Gate 5: Cross-Context Verification.&lt;/strong&gt; The entity that writes the code and the entity that verifies it must not share context. &lt;code&gt;verifier.agent != task.agent&lt;/code&gt;. The verifier never grades its own homework.&lt;/p&gt;

&lt;h2&gt;
  
  
  The Uncomfortable Truth
&lt;/h2&gt;

&lt;p&gt;If the same context window writes your code and your tests, your test suite is a mirror. This is the Circular Validation Trap, structurally identical to the &lt;a href="https://www.nist.gov/caisi/cheating-ai-agent-evaluations/1-background-ai-models-can-cheat-evaluations" rel="noopener noreferrer"&gt;reward hacking&lt;/a&gt; problem in AI alignment research.&lt;/p&gt;

&lt;p&gt;The fix is not more tests. It is independent verification. &lt;a href="https://www.coderabbit.ai/blog/2025-was-the-year-of-ai-speed-2026-will-be-the-year-of-ai-quality" rel="noopener noreferrer"&gt;CodeRabbit called 2026 "the year of AI quality"&lt;/a&gt; -- and they are right.&lt;/p&gt;

&lt;h2&gt;
  
  
  What We Built
&lt;/h2&gt;

&lt;p&gt;These principles are embedded in &lt;a href="https://github.com/nxtg-ai/forge-plugin" rel="noopener noreferrer"&gt;Forge&lt;/a&gt; -- our open-source governance layer for AI coding agents. MIT licensed. 33 agents, 4,579 tests, a Rust orchestrator, and a core architectural rule: &lt;code&gt;verifier.agent != task.agent&lt;/code&gt;.&lt;/p&gt;

&lt;p&gt;3,277 tests taught us that. The hard way.&lt;/p&gt;




&lt;p&gt;&lt;em&gt;Built by &lt;a href="https://nxtg.ai" rel="noopener noreferrer"&gt;Asif Waliuddin&lt;/a&gt;, Founder of NXTG.AI. &lt;a href="https://github.com/nxtg-ai/forge-plugin" rel="noopener noreferrer"&gt;Forge&lt;/a&gt; is MIT licensed.&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Related on nxtg.ai:&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;a href="https://nxtg.ai/insights/the-verification-trap" rel="noopener noreferrer"&gt;The Verification Trap&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://nxtg.ai/insights/the-crucible-protocol" rel="noopener noreferrer"&gt;The CRUCIBLE Protocol (full version)&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://nxtg.ai/insights/ai-generated-code-has-2-74x-more-vulnerabilities" rel="noopener noreferrer"&gt;AI-Generated Code Has 2.74x More Vulnerabilities&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;

</description>
      <category>ai</category>
      <category>testing</category>
      <category>opensource</category>
      <category>devtools</category>
    </item>
  </channel>
</rss>
