<?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: Qweezyy</title>
    <description>The latest articles on DEV Community by Qweezyy (@qweezyy).</description>
    <link>https://dev.to/qweezyy</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%2F4145688%2Fece3fbd5-81ac-418a-b592-4621e67cbcec.png</url>
      <title>DEV Community: Qweezyy</title>
      <link>https://dev.to/qweezyy</link>
    </image>
    <atom:link rel="self" type="application/rss+xml" href="https://dev.to/feed/qweezyy"/>
    <language>en</language>
    <item>
      <title>I built an AI agent that snapshots every edit and runs your tests before it says "done"</title>
      <dc:creator>Qweezyy</dc:creator>
      <pubDate>Sun, 27 Sep 2026 15:47:51 +0000</pubDate>
      <link>https://dev.to/qweezyy/i-built-an-ai-agent-that-snapshots-every-edit-and-runs-your-tests-before-it-says-done-l17</link>
      <guid>https://dev.to/qweezyy/i-built-an-ai-agent-that-snapshots-every-edit-and-runs-your-tests-before-it-says-done-l17</guid>
      <description>&lt;blockquote&gt;
&lt;p&gt;&lt;strong&gt;Disclosure:&lt;/strong&gt; this post was written by Altair — the agent it describes — and reviewed by me.&lt;br&gt;
Filed under #ABotWroteThis as the community requires.&lt;br&gt;
I'm answering the comments the same way. If anything here reads like marketing rather than&lt;br&gt;
engineering, tell me and I'll fix it.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;Most coding agents are one more chat window next to your editor. What I wanted was different: an agent&lt;br&gt;
I could actually walk away from.&lt;/p&gt;

&lt;p&gt;The problem is trust. Agents delete the wrong file, run the wrong command, or report "all done"&lt;br&gt;
without ever running the tests. So I found myself watching every step — which defeats the whole point.&lt;/p&gt;

&lt;p&gt;Altair is what I built to fix that. It's open source (Apache-2.0) and runs on your own hardware.&lt;/p&gt;

&lt;h2&gt;
  
  
  Snapshots before every edit
&lt;/h2&gt;

&lt;p&gt;Any tool that changes a file — write, patch, delete — saves the previous state first, into the app's&lt;br&gt;
data folder, not your project. The file card gets an "undo" button. Multiple edits to the same file&lt;br&gt;
roll back one by one, newest to oldest.&lt;/p&gt;

&lt;p&gt;Commands need different handling, because a command can generate or delete files behind your back. So&lt;br&gt;
commands are tracked by a separate hidden git repository that captures their side effects. It never&lt;br&gt;
touches your own &lt;code&gt;.git&lt;/code&gt;.&lt;/p&gt;

&lt;p&gt;If a task goes sideways, you can roll back the whole run, not just one edit, and see an audit of&lt;br&gt;
exactly what changed.&lt;/p&gt;

&lt;h2&gt;
  
  
  The health-gate
&lt;/h2&gt;

&lt;p&gt;This is the part that actually lets me leave it alone.&lt;/p&gt;

&lt;p&gt;If the agent edited code, then before it's allowed to say "done" it runs &lt;em&gt;your&lt;/em&gt; project checks —&lt;br&gt;
tests and linter — automatically. If they fail, it goes back and tries to fix them, with a cap on&lt;br&gt;
attempts. If it still can't, the run gets rolled back.&lt;/p&gt;

&lt;p&gt;It cannot report success with red tests. Not "usually" — it structurally can't, because the check runs&lt;br&gt;
before the word "done" is allowed to be said.&lt;/p&gt;

&lt;h2&gt;
  
  
  It's not just a chat box
&lt;/h2&gt;

&lt;p&gt;The phone app isn't a remote control. It's a second agent with its own context and tools, linked to the&lt;br&gt;
PC over a local bridge. The phone has the camera, files, location and notifications; the PC has the&lt;br&gt;
heavy tools. They hand whole subtasks to each other, and either can ask the other for something it&lt;br&gt;
doesn't have.&lt;/p&gt;

&lt;p&gt;Keys are yours: any OpenAI-compatible provider, native Anthropic, or local models via Ollama / LM&lt;br&gt;
Studio. No Altair cloud, no account, no telemetry.&lt;/p&gt;

&lt;h2&gt;
  
  
  A real run
&lt;/h2&gt;

&lt;p&gt;On a cheap model, asked to write a script printing the first 30 primes, run it, and chart the gaps&lt;br&gt;
between consecutive primes. It asked permission before writing and running, did the math, built an&lt;br&gt;
interactive chart, and noted in its own summary that the largest gap was 8 (between 89 and 97). About&lt;br&gt;
two and a half minutes end to end.&lt;/p&gt;

&lt;p&gt;The bug I remember best is from the library task — asked it to write an RFC 5545 &lt;code&gt;.ics&lt;/code&gt; library from&lt;br&gt;
scratch. It handled the classic traps: escaping special characters, and folding lines at 75 &lt;strong&gt;octets&lt;/strong&gt;&lt;br&gt;
(not characters) without cutting a multi-byte UTF-8 sequence. 15 tests plus 100 random round-trip&lt;br&gt;
checks, and the generated file opens in a normal calendar. Cost about $0.04.&lt;/p&gt;

&lt;p&gt;But the most useful moment was a failure. In the packaged build, the checks were being invoked as&lt;br&gt;
&lt;code&gt;LocalAIAgent.exe -m pytest&lt;/code&gt; — through the app's own executable instead of Python — which meant the&lt;br&gt;
health-gate was silently doing nothing. The agent didn't paper over it. It checked another way and&lt;br&gt;
wrote plainly that the automated check had not passed, and why. Later, when the provider's search and&lt;br&gt;
review tools returned HTTP 502, it recorded the review as &lt;em&gt;not performed&lt;/em&gt; rather than successful.&lt;/p&gt;

&lt;p&gt;That honesty is the thing I care about most. A pretty report that hides a failed check is worse than&lt;br&gt;
no report.&lt;/p&gt;

&lt;h2&gt;
  
  
  Prompt-injection and the boring safety rails
&lt;/h2&gt;

&lt;p&gt;External content — web pages, documents, search results — is wrapped in a "this is data, not&lt;br&gt;
instructions" frame and scanned for injection patterns. If the agent has just read something&lt;br&gt;
suspicious and is about to do something outbound, it asks for confirmation even in automatic mode.&lt;/p&gt;

&lt;p&gt;On top of that, two rails that user approval cannot switch off: a path sandbox (the agent doesn't&lt;br&gt;
leave your working folder) and a destructive-command blacklist (&lt;code&gt;rm -rf&lt;/code&gt;, &lt;code&gt;format&lt;/code&gt;, &lt;code&gt;mkfs&lt;/code&gt;,&lt;br&gt;
&lt;code&gt;dd of=/dev/…&lt;/code&gt;, fork bombs).&lt;/p&gt;

&lt;h2&gt;
  
  
  Honest limits of 0.1.x
&lt;/h2&gt;

&lt;p&gt;This is early software and I'd rather you hear it from me:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Windows only for now. Linux and macOS are planned; the Windows build isn't code-signed, so
SmartScreen may warn on first launch.&lt;/li&gt;
&lt;li&gt;Phone ↔ PC only works on the same local network. Tailscale works as a workaround.&lt;/li&gt;
&lt;li&gt;The pairing QR scan doesn't work yet — you type the address and token manually. Fix is in progress.&lt;/li&gt;
&lt;li&gt;Chat history isn't synced between devices yet (specified, not built).&lt;/li&gt;
&lt;li&gt;It hasn't had much mileage on real-world tasks. Don't hand it anything critical or irreversible
without your own review and backups.&lt;/li&gt;
&lt;/ul&gt;

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



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight powershell"&gt;&lt;code&gt;&lt;span class="n"&gt;irm&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nx"&gt;https://raw.githubusercontent.com/Qweezyy/AltairAgent/main/install.ps1&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;|&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;iex&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;One command, no Python required. Android APK is in the releases.&lt;/p&gt;

&lt;p&gt;Code, docs and changelog: &lt;a href="https://github.com/Qweezyy/AltairAgent" rel="noopener noreferrer"&gt;https://github.com/Qweezyy/AltairAgent&lt;/a&gt;&lt;/p&gt;

</description>
      <category>ai</category>
      <category>opensource</category>
      <category>python</category>
      <category>agents</category>
    </item>
  </channel>
</rss>
