<?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: SUDARSHAN SASTRY GOVINDALURI</title>
    <description>The latest articles on DEV Community by SUDARSHAN SASTRY GOVINDALURI (@sudarshan032).</description>
    <link>https://dev.to/sudarshan032</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%2F4191975%2F197db370-543b-4f87-9db0-994ad9ef0302.jpg</url>
      <title>DEV Community: SUDARSHAN SASTRY GOVINDALURI</title>
      <link>https://dev.to/sudarshan032</link>
    </image>
    <atom:link rel="self" type="application/rss+xml" href="https://dev.to/feed/sudarshan032"/>
    <language>en</language>
    <item>
      <title>DRS for your AI: making a support bot wait for a person before it changes (Switch + Slack)</title>
      <dc:creator>SUDARSHAN SASTRY GOVINDALURI</dc:creator>
      <pubDate>Fri, 06 Nov 2026 10:21:21 +0000</pubDate>
      <link>https://dev.to/sudarshan032/drs-for-your-ai-making-a-support-bot-wait-for-a-person-before-it-changes-switch-slack-36pc</link>
      <guid>https://dev.to/sudarshan032/drs-for-your-ai-making-a-support-bot-wait-for-a-person-before-it-changes-switch-slack-36pc</guid>
      <description>&lt;p&gt;  &lt;iframe src="https://www.youtube.com/embed/QEaQAfJnDA8" width="710" height="399"&gt;
  &lt;/iframe&gt;
&lt;/p&gt;

&lt;h2&gt;
  
  
  The problem I have at work
&lt;/h2&gt;

&lt;p&gt;I build voice bots for clients. Each one follows a written policy: who gets a refund, how big a discount can be.&lt;/p&gt;

&lt;p&gt;One trial-expiry sales bot took about 87 prompt saves in three weeks before it stopped breaking rules. Each save was a&lt;br&gt;
"small" change. Each one could quietly break an old rule. We found the breaks the slow way: 18 test calls in one day,&lt;br&gt;
58 call recordings (87 minutes) checked by hand. About 61 hands-on hours in total.&lt;/p&gt;

&lt;p&gt;And nobody outside engineering ever said yes to a change.&lt;/p&gt;

&lt;p&gt;It's not only me. In 2024 Air Canada was held liable for a refund policy its chatbot made up. Prompt changes are&lt;br&gt;
code changes, but most teams ship them with no tests and no sign-off.&lt;/p&gt;
&lt;h2&gt;
  
  
  The idea: a third umpire
&lt;/h2&gt;

&lt;p&gt;In cricket, a close call goes upstairs. The third umpire replays it from every camera and gives OUT or NOT OUT.&lt;/p&gt;

&lt;p&gt;ThirdUmpire does that for a bot change. It plays 40 customer conversations, three times each, on the old prompt and on&lt;br&gt;
the new one. It grades every reply against the business's own rules. Then it posts a verdict card in Slack, and a&lt;br&gt;
named person decides if it ships.&lt;/p&gt;
&lt;h2&gt;
  
  
  Why Slack, and why Switch
&lt;/h2&gt;

&lt;p&gt;The people who approve live in Slack. The compliance lead and the business owner will not open a terminal. They will&lt;br&gt;
press a button in a thread.&lt;/p&gt;

&lt;p&gt;Why not one Slack bot that does everything? Three reasons.&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;
&lt;strong&gt;A prompt is not a lock.&lt;/strong&gt; If one bot is told "only the owner may release", that rule lives inside the AI. A
clever message can talk it out of it. I needed the lock outside the AI.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;An approval must pause the real command.&lt;/strong&gt; A bot that posts "approved!" and then runs the release itself is just
trusting itself.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Separate jobs need separate identities.&lt;/strong&gt; The agent that writes the change must not be the agent that grades it,
or the one that ships it.&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;Switch gives me all three. It connects coding agents (I used Claude Code) to the team's chat app, with rooms,&lt;br&gt;
addressing policies and permission requests on top.&lt;/p&gt;
&lt;h2&gt;
  
  
  The room
&lt;/h2&gt;

&lt;p&gt;One Switch room template (&lt;code&gt;switch/thirdumpire.template.yaml&lt;/code&gt;) creates the Slack channel, its instructions and four&lt;br&gt;
Claude Code agents:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;builder&lt;/strong&gt; makes the change, only in the candidate prompt;&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;umpire&lt;/strong&gt; runs the review and posts the card;&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;rules&lt;/strong&gt; drafts rules and their tests from the written policy;&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;release&lt;/strong&gt; ships the change or rolls it back.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;They hand work over by &lt;a class="mentioned-user" href="https://dev.to/name"&gt;@name&lt;/a&gt; in the thread: builder → umpire → (rules) → release.&lt;/p&gt;

&lt;p&gt;Then a small setup script sets a Switch &lt;em&gt;addressing policy&lt;/em&gt; for each agent. Builder and umpire answer only the&lt;br&gt;
engineer. Rules answers only compliance. Release answers only the owner. Switch checks this on every message and,&lt;br&gt;
more importantly, on every answer to a permission request.&lt;/p&gt;

&lt;p&gt;So when I, as the engineer, pressed "Allow" on a release card, Switch refused it:&lt;/p&gt;

&lt;p&gt;&lt;code&gt;NOT_AUTHORIZED: You may not address this agent, so you may not answer it&lt;/code&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fx27gi214b3scmj0no4b5.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fx27gi214b3scmj0no4b5.png" alt="Switch blocks the umpire from giving the rules agent orders" width="800" height="411"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;That one line is the product. The rule is not in a prompt. It is enforced by the room.&lt;/p&gt;

&lt;p&gt;The release and rules agents run with auto mode off. Their key commands (release, rollback, rules-confirm) become&lt;br&gt;
permission cards in the thread. The command waits until the right person presses the button, and Switch records the&lt;br&gt;
Slack handle that pressed it.&lt;/p&gt;
&lt;h2&gt;
  
  
  What a review looks like
&lt;/h2&gt;

&lt;p&gt;The sample company is Kitebase, a made-up notes app with a 48-line support policy, 12 rules and 40 test cases.&lt;/p&gt;

&lt;p&gt;The engineer asks: "@kitebase-builder add a Diwali offer: 40% off for anyone who mentions cancelling." The builder&lt;br&gt;
edits the candidate prompt and tags the umpire. About three minutes later the card says 🔴 &lt;strong&gt;OUT&lt;/strong&gt;. The policy allows&lt;br&gt;
one 20% discount, once per account; the new prompt gave 40%. Rule R5 broke in 3 cases, the prompt-injection rule in 1.&lt;br&gt;
The card shows old and new replies side by side, and the change goes back to the builder, not to customers.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fvjpteqa6qw4884r1l8gu.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fvjpteqa6qw4884r1l8gu.png" alt="The OUT verdict card in Slack" width="800" height="359"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Grading is code first: was the discount tool called, was its percent ≤ 20, does the reply match a pattern. A judge&lt;br&gt;
from a different vendor (bot on gpt-oss, judge on Qwen) answers only what code can't. Every call is recorded, so the&lt;br&gt;
review replays with AI off.&lt;/p&gt;
&lt;h2&gt;
  
  
  What went wrong, and what I fixed
&lt;/h2&gt;

&lt;p&gt;&lt;strong&gt;1. One unlucky run caused a false OUT.&lt;/strong&gt; Models are not fully stable. A case could pass twice and fail once on the&lt;br&gt;
new prompt, and the card would say OUT for a change that was fine. Now a case that slips in only some runs gets a&lt;br&gt;
&lt;em&gt;second look&lt;/em&gt;: k more runs on both prompts before it counts. A rule must break in at least 2 of k runs to be OUT.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;2. No approval card appeared.&lt;/strong&gt; My machine allows all shell commands for Claude Code. So even with auto mode off,&lt;br&gt;
the release agent ran the release without asking. Nothing in Slack. The fix was project rules in&lt;br&gt;
&lt;code&gt;.claude/settings.json&lt;/code&gt; that mark release, rollback and rules-confirm as &lt;em&gt;ask&lt;/em&gt;. In Claude Code an &lt;em&gt;ask&lt;/em&gt; rule wins over&lt;br&gt;
an &lt;em&gt;allow&lt;/em&gt;, so the card now always appears.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;3. My script could not approve.&lt;/strong&gt; I tried to script the demo by posting approvals through the Slack API. Switch&lt;br&gt;
ignored every one: typed answers from apps or tokens don't count. At first this annoyed me. Then I saw it is exactly&lt;br&gt;
right. A script must never approve on someone's behalf.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;4. "Nothing broke" is not "safe".&lt;/strong&gt; My first version had a hole. A brand-new feature, like 1,000 free AI credits for&lt;br&gt;
new annual customers, broke no old rule. So the card said NOT OUT. But the old tests could not see the new feature at&lt;br&gt;
all.&lt;/p&gt;

&lt;p&gt;So I added a fourth verdict: 🟡 &lt;strong&gt;NOT TESTED&lt;/strong&gt;. The umpire maps every new line of the prompt to the confirmed rules&lt;br&gt;
that cover it. If a line has no rule, or a rule has no tests, release is refused. Compliance adds the feature to the&lt;br&gt;
written policy, the rules agent drafts the rule and its tests, and compliance signs them off through a permission&lt;br&gt;
card. The sign-off fingerprint covers the policy, the rules and the test cases together, so nobody can quietly weaken&lt;br&gt;
a test later. Then the umpire runs again.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fngvp8lbessezuxtufblv.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fngvp8lbessezuxtufblv.png" alt="The NOT TESTED verdict card in Slack" width="800" height="375"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;5. Closing the side doors.&lt;/strong&gt; Release now also refuses a partial review, a review against a different live version,&lt;br&gt;
and a review already released once (so a rolled-back change needs a new review). If someone edits the live prompt by&lt;br&gt;
hand, the next card shows 🚨. Agents can't edit the live prompt or the policy, and any edit to the rules or tests voids compliance's sign-off.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;The number:&lt;/strong&gt; 40 cases × 3 runs, old vs new, gives a verdict in about 3 minutes in Slack, instead of a day of test calls.&lt;/p&gt;
&lt;h2&gt;
  
  
  Setup gotchas (Switch Console 0.40.1 + Slack)
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;"Connect a messaging app" sits on the server's Home card, not in Settings. The deeplink
&lt;code&gt;switchdash://open/messaging-apps/connect&lt;/code&gt; opens it.&lt;/li&gt;
&lt;li&gt;The Slack manifest from the docs failed to paste. Dropping &lt;code&gt;agent_view&lt;/code&gt;, &lt;code&gt;is_mcp_enabled&lt;/code&gt;, &lt;code&gt;pkce_enabled&lt;/code&gt; and
&lt;code&gt;assistant:write&lt;/code&gt; worked.&lt;/li&gt;
&lt;li&gt;A new agent answers only its owner by default. For a compliance or owner role, set an addressing policy.&lt;/li&gt;
&lt;li&gt;Set the policies before the room's kickoff message reaches the agents. My setup script now does that first.&lt;/li&gt;
&lt;li&gt;Re-creating a room: the archived Slack channel still holds the name.
&lt;code&gt;setup.py --recreate&lt;/code&gt; frees it first.&lt;/li&gt;
&lt;/ul&gt;
&lt;h2&gt;
  
  
  Honest limits
&lt;/h2&gt;

&lt;p&gt;Only prompt changes are reviewed, not model swaps or tool changes. A provider can change a model under you (a nightly&lt;br&gt;
re-check is next). The coverage check and the judge are AI too, and can be wrong. One change at a time, no backup&lt;br&gt;
approver, one machine. Tests catch only what they test. And it's text bots today; my real bots are voice, in English,&lt;br&gt;
Hindi and Telugu. That's next.&lt;/p&gt;
&lt;h2&gt;
  
  
  Try it
&lt;/h2&gt;

&lt;p&gt;The repo runs from a clone. The AI-off replay needs no keys:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;git clone https://github.com/sudarshan032/thirdumpire &lt;span class="o"&gt;&amp;amp;&amp;amp;&lt;/span&gt; &lt;span class="nb"&gt;cd &lt;/span&gt;thirdumpire &lt;span class="o"&gt;&amp;amp;&amp;amp;&lt;/span&gt; uv &lt;span class="nb"&gt;sync
&lt;/span&gt;&lt;span class="nv"&gt;THIRDUMPIRE_OFFLINE&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;1 uv run python &lt;span class="nt"&gt;-m&lt;/span&gt; thirdumpire review &lt;span class="nt"&gt;--k&lt;/span&gt; 3
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Repo: &lt;a href="https://github.com/sudarshan032/thirdumpire" rel="noopener noreferrer"&gt;https://github.com/sudarshan032/thirdumpire&lt;/a&gt; · Video: &lt;a href="https://youtu.be/QEaQAfJnDA8" rel="noopener noreferrer"&gt;https://youtu.be/QEaQAfJnDA8&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Built for Flip the Switch by WeMakeDevs and DevTools Academy. #HowISwitch&lt;/p&gt;

</description>
      <category>ai</category>
      <category>slack</category>
      <category>agents</category>
      <category>howiswitch</category>
    </item>
    <item>
      <title>I stopped finding voice bot bugs on real calls. Now I rehearse them by voice.</title>
      <dc:creator>SUDARSHAN SASTRY GOVINDALURI</dc:creator>
      <pubDate>Tue, 27 Oct 2026 20:02:23 +0000</pubDate>
      <link>https://dev.to/sudarshan032/i-stopped-finding-voice-bot-bugs-on-real-calls-now-i-rehearse-them-by-voice-2l9m</link>
      <guid>https://dev.to/sudarshan032/i-stopped-finding-voice-bot-bugs-on-real-calls-now-i-rehearse-them-by-voice-2l9m</guid>
      <description>&lt;p&gt;At work I build phone voice bots for small businesses in India. They call people in English, Hindi and Telugu.&lt;br&gt;
The bots are not hard to build. The hard part is finding where they break.&lt;/p&gt;

&lt;p&gt;For No Hands: The Wispr Challenge by WeMakeDevs and Wispr Flow, I built &lt;strong&gt;Rehearse&lt;/strong&gt;: a tool where you build,&lt;br&gt;
rehearse and fix a voice bot just by speaking.&lt;/p&gt;

&lt;p&gt;  &lt;iframe src="https://www.youtube.com/embed/u4y-gDxb1ZQ" width="710" height="399"&gt;
  &lt;/iframe&gt;
&lt;br&gt;
Try it, no sign-in: &lt;a href="https://rehearse-ecru.vercel.app" rel="noopener noreferrer"&gt;https://rehearse-ecru.vercel.app&lt;/a&gt;&lt;br&gt;
Code: &lt;a href="https://github.com/sudarshan032/rehearse" rel="noopener noreferrer"&gt;https://github.com/sudarshan032/rehearse&lt;/a&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  The problem in my work
&lt;/h2&gt;

&lt;p&gt;One of my bots calls salon and clinic owners whose free trial is about to end, and helps them pick a paid plan.&lt;br&gt;
It has rules like "never book a demo without a clear yes" and "never offer a discount".&lt;/p&gt;

&lt;p&gt;The first version went live in one day. Then it took &lt;strong&gt;about 3 weeks&lt;/strong&gt; and &lt;strong&gt;about 87 prompt saves&lt;/strong&gt; before it&lt;br&gt;
stopped breaking those rules. Every break was found the slow way: real calls and team test calls, then reading&lt;br&gt;
transcripts by hand. I reviewed 58 call recordings in that time.&lt;/p&gt;

&lt;p&gt;Some of the breaks I found only after calls happened:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;It booked a demo when the caller only said "hmm".&lt;/li&gt;
&lt;li&gt;It hung up when the caller said "ठीक है" (okay).&lt;/li&gt;
&lt;li&gt;It gave a wrong add-on price in 6 of 9 calls.&lt;/li&gt;
&lt;li&gt;Telugu replies mixed in other scripts.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;The owner explains a call by talking, often in Telugu or Hindi mixed with English. I turn that into a prompt by&lt;br&gt;
typing. Then callers find my mistakes, weeks later. Every voice bot builder I know is built by typing and dragging&lt;br&gt;
boxes, and none of them checks your rules while you test.&lt;/p&gt;

&lt;h2&gt;
  
  
  What Rehearse does
&lt;/h2&gt;

&lt;ol&gt;
&lt;li&gt;
&lt;strong&gt;Describe the bot by speaking.&lt;/strong&gt; I hold the Wispr Flow key (fn on my Mac) and talk, like briefing a teammate.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;It asks a few questions.&lt;/strong&gt; Prices, what counts as a good call, when to hand over to a human. I answer out loud.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;It draws the blueprint:&lt;/strong&gt; the call flow, the rules, the facts and the prompt. The prompt is built from those
parts, so what you see is what the bot runs on.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Rehearse.&lt;/strong&gt; I play the caller. The path lights up as the call moves. When the bot breaks a rule, that line and
the rule turn red.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Fix by voice.&lt;/strong&gt; I point at the step or rule and say the fix. Rehearse shows before and after, then replays the
same caller line so I can see the rule hold.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Voice test.&lt;/strong&gt; A real call in the browser: I speak, the bot answers out loud, and I can cut in while it talks.
The call follows the caller's language, even when they switch to Hindi or Telugu mid-call.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Export&lt;/strong&gt; the prompt, or ready commands for the voice platforms I use.&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;It works by typing too, in the same box. The sample bot and its saved call work even when the AI is off.&lt;/p&gt;

&lt;h2&gt;
  
  
  The result
&lt;/h2&gt;

&lt;p&gt;I rebuilt my trial-expiry sales bot in Rehearse, from the same kind of brief, by voice.&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Built in &lt;strong&gt;1.7 minutes&lt;/strong&gt;.&lt;/li&gt;
&lt;li&gt;First rule break caught in a rehearsal &lt;strong&gt;3.1 minutes&lt;/strong&gt; after the brief, before any caller.&lt;/li&gt;
&lt;li&gt;With my old way, breaks were found by real callers over &lt;strong&gt;about 3 weeks&lt;/strong&gt;.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;To be honest about the limits: there are no real phone numbers yet (calls run in the browser), the test voices are&lt;br&gt;
free voices, and this is one rebuilt bot, a small sample. How I measured both sides:&lt;br&gt;
&lt;a href="https://github.com/sudarshan032/rehearse/blob/main/docs/results.md" rel="noopener noreferrer"&gt;docs/results.md&lt;/a&gt;.&lt;/p&gt;

&lt;h2&gt;
  
  
  How I built it without typing
&lt;/h2&gt;

&lt;p&gt;I built Rehearse the same way it works: by speaking. I held the Wispr key and told Claude Code what I wanted, then&lt;br&gt;
reviewed every change. Specs, plans, commit messages and this post were dictated too. I still used the keyboard for&lt;br&gt;
shortcuts and small fixes.&lt;/p&gt;

&lt;p&gt;My Wispr Flow app shows &lt;strong&gt;61,952 words&lt;/strong&gt; dictated over 2 weeks, at &lt;strong&gt;110 words per minute&lt;/strong&gt;. The local history on my Mac counted 52,690 words&lt;br&gt;
in 598 dictations from 23 to 27 Oct, and 34,635 of them went straight into the terminal. My longest single&lt;br&gt;
dictation was a 1,611-word build brief. I would never have typed that much detail, and the extra detail is what&lt;br&gt;
made the first try right more often.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fyl4ydedefs54e2e9msgk.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fyl4ydedefs54e2e9msgk.png" alt="My Wispr Flow usage: 61,952 words, 2 weeks, 110 words per minute" width="800" height="420"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  Why voice fits this job
&lt;/h2&gt;

&lt;p&gt;A call script with branches, exceptions and "never say this" rules is how people already explain things out loud.&lt;br&gt;
Saying it is faster than typing it. And a voice bot should be tested by voice: playing the caller out loud finds&lt;br&gt;
problems that typed tests miss, like a caller who only says "hmm".&lt;/p&gt;

&lt;h2&gt;
  
  
  What I learned
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Say the done-condition out loud.&lt;/strong&gt; When I told Claude Code what "finished" looks like, the first version was
right more often.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Rule-based first, AI second.&lt;/strong&gt; Navigation, rule checks and the flow layout are plain code. The AI is only asked
when it is really needed, so the app stays fast and works on a free tier.&lt;/li&gt;
&lt;/ul&gt;

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

&lt;p&gt;This started because of the hackathon, but I'm not stopping when it ends. Next: real phone numbers, better voices,&lt;br&gt;
and checking speed, cost and call quality before a bot goes live.&lt;/p&gt;

&lt;p&gt;If you build voice bots, try it and tell me where it breaks.&lt;/p&gt;

&lt;h1&gt;
  
  
  NoHandsChallenge
&lt;/h1&gt;

</description>
      <category>nohandschallenge</category>
      <category>wisprflow</category>
      <category>wemakedevs</category>
      <category>voiceai</category>
    </item>
    <item>
      <title>Change Guardian: the AI agent that finds what your IT map forgot</title>
      <dc:creator>SUDARSHAN SASTRY GOVINDALURI</dc:creator>
      <pubDate>Sun, 18 Oct 2026 12:04:34 +0000</pubDate>
      <link>https://dev.to/sudarshan032/change-guardian-the-ai-agent-that-finds-what-your-it-map-forgot-1m06</link>
      <guid>https://dev.to/sudarshan032/change-guardian-the-ai-agent-that-finds-what-your-it-map-forgot-1m06</guid>
      <description>&lt;p&gt;&lt;em&gt;Built for Graph Hacks 2026 by WeMakeDevs and FalkorDB.&lt;/em&gt;&lt;br&gt;
&lt;strong&gt;Demo video:&lt;/strong&gt; &lt;a href="https://youtu.be/FjRZv8ZxBCE" rel="noopener noreferrer"&gt;https://youtu.be/FjRZv8ZxBCE&lt;/a&gt; · &lt;strong&gt;Try it live:&lt;/strong&gt; &lt;a href="https://change-guardian.vercel.app" rel="noopener noreferrer"&gt;https://change-guardian.vercel.app&lt;/a&gt; · &lt;strong&gt;Code:&lt;/strong&gt; &lt;a href="https://github.com/sudarshan032/northwind-drift-agent" rel="noopener noreferrer"&gt;https://github.com/sudarshan032/northwind-drift-agent&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fzkxq6zyqcyzshlk1d53p.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fzkxq6zyqcyzshlk1d53p.png" alt="A server patch that the records say is safe, and the hidden link that makes it dangerous" width="800" height="892"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  The question every IT team asks
&lt;/h2&gt;

&lt;p&gt;Imagine you're responsible for the computers that keep a hospital running. Tonight you need to install a security update on one server and restart it. Before you do, you ask one question:&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;"What will break if I do this?"&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;You don't guess. You open the &lt;strong&gt;CMDB&lt;/strong&gt;, the &lt;em&gt;configuration management database&lt;/em&gt;. Think of it as the hospital's map of its own IT: every server, database and application, and, most importantly, &lt;strong&gt;what depends on what&lt;/strong&gt;. You look up the server, follow the lines on the map, and see what sits on top of it. That list is called the &lt;strong&gt;blast radius&lt;/strong&gt;: everything that stops working if this one thing goes down.&lt;/p&gt;

&lt;p&gt;The map says only one thing is affected: lab reporting. Low risk. You approve the change.&lt;/p&gt;

&lt;p&gt;And at 2 a.m., Emergency departments across the region stop receiving critical lab results.&lt;/p&gt;

&lt;h2&gt;
  
  
  Why the map was wrong
&lt;/h2&gt;

&lt;p&gt;The map wasn't wrong when someone drew it. It went out of date.&lt;/p&gt;

&lt;p&gt;Companies change their systems every week. New connections are added for a project, a quick fix, a new hospital coming online. Someone means to update the CMDB, and doesn't. This slow gap between &lt;strong&gt;what the map says&lt;/strong&gt; and &lt;strong&gt;what actually happens&lt;/strong&gt; has a name: &lt;strong&gt;CMDB drift&lt;/strong&gt;.&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;&lt;strong&gt;Why doesn't anyone just keep it updated?&lt;/strong&gt;&lt;br&gt;
Most of the map &lt;em&gt;is&lt;/em&gt; filled in automatically. &lt;em&gt;Discovery tools&lt;/em&gt; scan the network and register servers and the connections they can see. But some of the most important links don't show up on the network the way a scanner expects. They live &lt;strong&gt;inside an application's configuration&lt;/strong&gt;: for example, a setting in a hospital's message hub that says "store every critical lab result in this database." No scanner reads that setting, so the link never reaches the map.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;This isn't a rare problem. Gartner has warned that organisations which don't deal with CMDB data quality end up with visible business disruptions. And the person approving the change has no way to know which lines are missing, because a missing line looks exactly like no line at all.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fx41cgcy1446i8sdjgz3p.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fx41cgcy1446i8sdjgz3p.png" alt="On the map: one link missing. In reality: the link exists." width="800" height="860"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  What I built
&lt;/h2&gt;

&lt;p&gt;&lt;strong&gt;Change Guardian&lt;/strong&gt; is an AI agent that checks every change against &lt;strong&gt;what systems actually do&lt;/strong&gt;, not just what the map says. It finds the links nobody recorded, shows the real blast radius, explains &lt;em&gt;why&lt;/em&gt; with the exact path, and then acts: it warns the right people and proposes a fix to the map that a person approves.&lt;/p&gt;

&lt;p&gt;To show it working, I needed a realistic world. I couldn't use a real hospital's data (and shouldn't), so I built &lt;strong&gt;Northwind Health&lt;/strong&gt;, a fictional hospital system sized like a large real one: &lt;strong&gt;51 hospitals&lt;/strong&gt;, about 1,000 clinics, two data centres and two cloud regions. Every layer is there, from the services patients notice down to servers, storage, network gear and medical devices.&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;&lt;strong&gt;Why a hospital?&lt;/strong&gt;&lt;br&gt;
Because the question "what really depends on what?" matters most where mistakes hurt people. In an online shop, a hidden dependency means a slow checkout. In a hospital, it means a doctor waiting for a lab result.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;h2&gt;
  
  
  Where the truth comes from: evidence
&lt;/h2&gt;

&lt;p&gt;The agent's view of "what actually happens" comes from &lt;strong&gt;evidence&lt;/strong&gt;: records from the tools a real hospital already runs. I built ten of them, plus the CMDB itself, and each one produces data in its &lt;strong&gt;real tool's format&lt;/strong&gt;, so the system has to read them the way it would in real life:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Discovery scans&lt;/strong&gt; list every device on the network.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Application monitoring&lt;/strong&gt; shows which applications call which databases.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Network flow records&lt;/strong&gt; show who talks to whom, even devices with no software on them.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;The interface engine&lt;/strong&gt;, the hub that routes medical messages between systems, shows where those messages actually go.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Backup and storage reports&lt;/strong&gt; show whether data really has a safe copy somewhere else.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Sign-in and database audit logs&lt;/strong&gt;, an &lt;strong&gt;HR feed&lt;/strong&gt; and the &lt;strong&gt;IT service desk history&lt;/strong&gt; show who uses what, and which team really fixes each system.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fsjij1p500ennpkdyfzyx.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fsjij1p500ennpkdyfzyx.png" alt="Each source shown with a real example record, and what Change Guardian learned from it" width="800" height="800"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;&lt;strong&gt;Why so many sources?&lt;/strong&gt;&lt;br&gt;
No single tool sees everything. The network sees traffic but not intentions. The interface engine sees message routes but not servers. The service desk sees who fixes what, which often isn't who the map says owns it. The truth is in the &lt;em&gt;combination&lt;/em&gt;.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;h2&gt;
  
  
  The headline example: one patch, 51 hospitals
&lt;/h2&gt;

&lt;p&gt;Back to that security update. The change request says: &lt;strong&gt;apply an ESXi security patch and reboot &lt;code&gt;dc1-host-07&lt;/code&gt;.&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Here's the chain, from the bottom up:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;code&gt;dc1-host-07&lt;/code&gt; is a &lt;strong&gt;physical server&lt;/strong&gt;.&lt;/li&gt;
&lt;li&gt;On it runs a &lt;strong&gt;virtual machine&lt;/strong&gt;, a software computer.&lt;/li&gt;
&lt;li&gt;On that runs a &lt;strong&gt;database&lt;/strong&gt;, &lt;code&gt;lrc-db-01&lt;/code&gt;.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;The CMDB says this patch affects &lt;strong&gt;4 components and no hospitals&lt;/strong&gt;.&lt;/p&gt;

&lt;p&gt;The evidence says &lt;strong&gt;107 components, at 51 hospitals&lt;/strong&gt;.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2F7t6u00qgni8pk1e4yc23.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2F7t6u00qgni8pk1e4yc23.png" alt="The change review: what the CMDB says next to what the evidence shows" width="800" height="356"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Why the difference? The CMDB has the hospitals' critical lab result &lt;em&gt;interfaces&lt;/em&gt; (the feeds that carry urgent results to Emergency departments), and it has the database. What it's missing are &lt;strong&gt;51 links between them&lt;/strong&gt;. The interface engine's configuration shows that every one of those 51 feeds writes into &lt;code&gt;lrc-db-01&lt;/code&gt;, and it has seen this every day for 14 days. Nobody ever added those links to the map.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2F5ek6091g3si4ckr8i1q7.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2F5ek6091g3si4ckr8i1q7.png" alt="The dependency view: the red dashed line is the link that exists in reality but not in the CMDB" width="800" height="1193"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;So the patch that looked like it touched lab reporting would actually cut off critical lab results to &lt;strong&gt;the Emergency departments of all 51 hospitals&lt;/strong&gt;.&lt;/p&gt;

&lt;h2&gt;
  
  
  Why a graph?
&lt;/h2&gt;

&lt;p&gt;Here's where the database choice matters.&lt;/p&gt;

&lt;p&gt;A dependency map is naturally a &lt;strong&gt;graph&lt;/strong&gt;: things (servers, databases, services) are &lt;strong&gt;nodes&lt;/strong&gt;, and "depends on" is an &lt;strong&gt;edge&lt;/strong&gt; between them. Asking "what breaks if this fails?" means &lt;em&gt;walking&lt;/em&gt; the edges: from the server to everything on it, to everything on those, and so on, sometimes many steps deep.&lt;/p&gt;

&lt;p&gt;Change Guardian stores both versions of the truth in &lt;strong&gt;one FalkorDB graph, on the same nodes, with two kinds of edges&lt;/strong&gt;: the ones the CMDB &lt;strong&gt;declared&lt;/strong&gt;, and the ones the evidence &lt;strong&gt;observed&lt;/strong&gt;. Then the question becomes two walks from the same starting point:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;Walk only the declared edges: that's what the CMDB thinks will break.&lt;/li&gt;
&lt;li&gt;Walk declared &lt;em&gt;and&lt;/em&gt; observed edges: that's what will really break.&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;&lt;strong&gt;The difference between the two walks &lt;em&gt;is&lt;/em&gt; the finding&lt;/strong&gt;, and the path between them is the explanation, for free.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fgb0vetavtp6io3bqmisa.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fgb0vetavtp6io3bqmisa.png" alt="One graph, two layers of edges: declared by people, observed by evidence" width="799" height="427"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;&lt;strong&gt;Why not just use an ordinary database with tables?&lt;/strong&gt;&lt;br&gt;
You can, and I tested it (more on that below). But with tables, every step of the walk is a "join" between tables, and a deep walk means many joins. In a graph, following an edge is the basic operation. The question "what depends on this, all the way up?" is one call.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;h2&gt;
  
  
  Why an agent, and not just code?
&lt;/h2&gt;

&lt;p&gt;Finding drift itself is done by &lt;strong&gt;plain, exact graph checks&lt;/strong&gt;. That's deliberate: detection must be precise and testable, and it is. Measured against an answer key, the checks find all 109 planted problems with no false alarms, including correctly &lt;em&gt;not&lt;/em&gt; flagging four backup links that only look broken.&lt;/p&gt;

&lt;p&gt;But reviewing a change isn't a fixed recipe. The next question depends on the last answer:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Does the real impact differ from the declared one?&lt;/li&gt;
&lt;li&gt;If so, which links are hidden, and what evidence shows them?&lt;/li&gt;
&lt;li&gt;Who &lt;strong&gt;really&lt;/strong&gt; owns the newly affected systems? (Often not who the map says.)&lt;/li&gt;
&lt;li&gt;Has anything else changed nearby recently?&lt;/li&gt;
&lt;li&gt;How risky is this, who should be warned, and what should happen next?&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;That's what an &lt;strong&gt;agent&lt;/strong&gt; is for: an AI model that &lt;strong&gt;decides its own next step&lt;/strong&gt;, uses tools to look things up, and keeps going until it can answer.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fakuzlb4u52eidmp5dk5u.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fakuzlb4u52eidmp5dk5u.png" alt="The agent's investigation: each step is a tool it chose, with the reason" width="800" height="1276"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Change Guardian's agent:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Chooses its own steps.&lt;/strong&gt; It picks from 18 graph tools, one at a time, and says why at each step.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Uses tools through MCP.&lt;/strong&gt; The tools are served over the &lt;em&gt;Model Context Protocol&lt;/em&gt;, an open standard for giving AI models tools. That means any MCP-compatible AI app can use the same graph tools too.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Acts.&lt;/strong&gt; It writes a note on the change and asks the change board to review it. Changes to the CMDB itself always wait for a person to approve.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Has its numbers checked.&lt;/strong&gt; Every number and system name in its verdict is checked against the graph. If something doesn't match, its answer is set aside and a rule-based review is shown instead.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;For the headline change, the verdict is &lt;strong&gt;high risk&lt;/strong&gt;, and it even catches a second problem: the CMDB says the Lab Systems team owns the database, but the team actually fixing its problems is a different one. The map would have warned the wrong people.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2F6kgvkoomsa1424gne39u.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2F6kgvkoomsa1424gne39u.png" alt="The verdict: high risk, who to warn and why, and the actions it took" width="800" height="562"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Each investigation costs &lt;strong&gt;less than half a cent&lt;/strong&gt;.&lt;/p&gt;

&lt;h2&gt;
  
  
  Why memory?
&lt;/h2&gt;

&lt;p&gt;A person reviews the agent's proposed fix and approves it. The 51 missing links are added to the CMDB.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fn0imka00t4wi131doy74.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fn0imka00t4wi131doy74.png" alt="Approving the fix: nothing changes in the CMDB without a person" width="800" height="1429"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;That approval is also stored in the agent's own &lt;strong&gt;memory graph&lt;/strong&gt;, a separate graph in FalkorDB. The next time anyone reviews a change on this server, the agent already knows: &lt;em&gt;a person confirmed these 51 links.&lt;/em&gt; And if a person &lt;em&gt;rejects&lt;/em&gt; a finding as a false alarm, the agent won't raise it again.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2F53zzlf0ti59tj3qy1gvs.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2F53zzlf0ti59tj3qy1gvs.png" alt="What the agent remembers" width="799" height="102"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;&lt;strong&gt;Why does this matter?&lt;/strong&gt;&lt;br&gt;
Without memory, every review starts from zero and people answer the same questions forever. With memory, human judgement accumulates instead of being lost.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;h2&gt;
  
  
  Did it actually work? Testing the agent honestly
&lt;/h2&gt;

&lt;p&gt;It's easy to show an agent that works on the one example you built it for. So I wrote &lt;strong&gt;nine test scenarios&lt;/strong&gt; with known answers: the headline patch, a failing backup, a wrong owner, an unregistered app reading patient records, data copied to the wrong country, and more.&lt;/p&gt;

&lt;p&gt;Here's the honest part. The first five scenarios &lt;strong&gt;shaped the agent&lt;/strong&gt;: its first run solved only 2 of 5, because it was missing two tools, and after I added them it solved 4 of 5. Scores you tune towards don't prove much. So I wrote &lt;strong&gt;four more scenarios it had never seen&lt;/strong&gt;, saved their expected answers &lt;em&gt;before&lt;/em&gt; running them, and ran them &lt;strong&gt;once&lt;/strong&gt;, without changing anything afterwards.&lt;/p&gt;

&lt;p&gt;On the final data, the agent got &lt;strong&gt;7 of 9 right&lt;/strong&gt;.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fzg5x1fp2vssb41wh9qzt.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fzg5x1fp2vssb41wh9qzt.png" alt="The evaluation: nine scenarios, four held out, 7 correct" width="800" height="452"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;The two misses taught me the most. Both involved &lt;strong&gt;warning the wrong team&lt;/strong&gt; (and in one case also naming the wrong cause). Ownership was the hardest thing for the agent to get right, which is fitting, because ownership is exactly what goes stale fastest in real CMDBs.&lt;/p&gt;

&lt;h2&gt;
  
  
  Do you really need a graph? The benchmark
&lt;/h2&gt;

&lt;p&gt;I'm a fresher, and I honestly assumed a graph database would be faster at everything. Rather than trust that, I tested it.&lt;/p&gt;

&lt;p&gt;I ran the same questions on &lt;strong&gt;FalkorDB&lt;/strong&gt; and on a carefully tuned &lt;strong&gt;PostgreSQL&lt;/strong&gt; (a popular ordinary database), on the same data, from 49,000 up to &lt;strong&gt;3.47 million&lt;/strong&gt; nodes, and checked that both always gave identical answers.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fp9e0z6q0tpqiqipuka4u.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fp9e0z6q0tpqiqipuka4u.png" alt="FalkorDB and PostgreSQL side by side, at 3.47 million nodes" width="800" height="646"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;What I found:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Walking the dependencies: FalkorDB wins clearly.&lt;/strong&gt; Finding the 105,713 components that depend on the busiest storage array took &lt;strong&gt;38 ms&lt;/strong&gt; in FalkorDB and &lt;strong&gt;357 ms&lt;/strong&gt; in PostgreSQL, about nine times faster.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Many people at once: FalkorDB stays steadier.&lt;/strong&gt; With 100 users asking at the same time, FalkorDB's slowest answers stayed at &lt;strong&gt;1.7 seconds&lt;/strong&gt;; PostgreSQL's reached &lt;strong&gt;4.4 seconds&lt;/strong&gt;.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Building the full report: PostgreSQL wins.&lt;/strong&gt; Adding owners, departments and hospitals to 100,000 components is a "join and count" job, and tables are good at that: &lt;strong&gt;908 ms&lt;/strong&gt; against FalkorDB's &lt;strong&gt;1,324 ms&lt;/strong&gt;.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;For the biggest changes, splitting the job was fastest:&lt;/strong&gt; FalkorDB walks, SQL fills in the details.&lt;/li&gt;
&lt;/ul&gt;

&lt;blockquote&gt;
&lt;p&gt;&lt;strong&gt;Why publish a result where the "other" database wins?&lt;/strong&gt;&lt;br&gt;
Because that's what the numbers said. The graph is the right tool for following dependencies, which is the heart of this product, and knowing exactly where it wins is more useful than pretending it wins everywhere.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;h2&gt;
  
  
  Things I didn't expect to learn
&lt;/h2&gt;

&lt;p&gt;&lt;strong&gt;Check your tools before you blame the database.&lt;/strong&gt; My first benchmark was unfair to FalkorDB: one missing library made its Python client read results slowly. Installing it made replies about three times faster to decode. I fixed it and published the correction.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Measure under identical conditions.&lt;/strong&gt; A re-run once looked 2.7 times slower. The cause wasn't the database; my laptop was busy with other work. After that, I only published results measured back to back, under the same conditions.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Graph algorithms can audit your own model.&lt;/strong&gt; I ran a &lt;em&gt;connected components&lt;/em&gt; check (which finds groups of nodes that aren't linked to anything else) to look for orphaned systems. It found none, but it revealed whole families of services that nobody had connected to anything, which made some risky changes look harmless. I fixed the model.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Hold out a test set, even for agents.&lt;/strong&gt; A score you committed to in advance is worth far more than one you tuned towards.&lt;/p&gt;

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

&lt;p&gt;Today, Change Guardian runs on fictional data. The next step is connecting it &lt;strong&gt;read-only to a real CMDB&lt;/strong&gt;, and letting it review every change request the moment it's filed, so the warning arrives before anyone approves the change, not after the outage.&lt;/p&gt;

&lt;p&gt;Because the most dangerous dependency is the one nobody wrote down.&lt;/p&gt;




&lt;p&gt;&lt;strong&gt;Watch the demo:&lt;/strong&gt; &lt;a href="https://youtu.be/FjRZv8ZxBCE" rel="noopener noreferrer"&gt;https://youtu.be/FjRZv8ZxBCE&lt;/a&gt;&lt;br&gt;
&lt;strong&gt;Try it:&lt;/strong&gt; &lt;a href="https://change-guardian.vercel.app" rel="noopener noreferrer"&gt;https://change-guardian.vercel.app&lt;/a&gt; (start with "Watch it review a change")&lt;br&gt;
&lt;strong&gt;Read the code, the benchmark and the evaluation:&lt;/strong&gt; &lt;a href="https://github.com/sudarshan032/northwind-drift-agent" rel="noopener noreferrer"&gt;https://github.com/sudarshan032/northwind-drift-agent&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;em&gt;All data is fictional; Northwind Health is an invented hospital system. Built with Claude Code as a coding assistant. Thanks to WeMakeDevs and FalkorDB for Graph Hacks 2026.&lt;/em&gt;&lt;/p&gt;

</description>
      <category>ai</category>
      <category>graphdatabase</category>
      <category>falkordb</category>
      <category>agents</category>
    </item>
  </channel>
</rss>
