<?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: EdgeStorage</title>
    <description>The latest articles on DEV Community by EdgeStorage (@edgestorage).</description>
    <link>https://dev.to/edgestorage</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%2F4124950%2Ff3cc2b5b-1b2c-49dd-a192-cf96ba2c923f.jpg</url>
      <title>DEV Community: EdgeStorage</title>
      <link>https://dev.to/edgestorage</link>
    </image>
    <atom:link rel="self" type="application/rss+xml" href="https://dev.to/feed/edgestorage"/>
    <language>en</language>
    <item>
      <title>A review checklist for AI coding agent output (7 things I check before trusting a change)</title>
      <dc:creator>EdgeStorage</dc:creator>
      <pubDate>Tue, 15 Sep 2026 02:08:05 +0000</pubDate>
      <link>https://dev.to/edgestorage/a-review-checklist-for-ai-coding-agent-output-7-things-i-check-before-trusting-a-change-276c</link>
      <guid>https://dev.to/edgestorage/a-review-checklist-for-ai-coding-agent-output-7-things-i-check-before-trusting-a-change-276c</guid>
      <description>&lt;p&gt;Every team running an AI coding agent eventually hits the same wall: the agent produces a lot of output, and reviewing that output is now the bottleneck. A terminal transcript is not a review artifact. Here is the checklist I use before I trust an agent's change, and the tooling each line implies.&lt;/p&gt;

&lt;h2&gt;
  
  
  The checklist
&lt;/h2&gt;

&lt;p&gt;&lt;strong&gt;1. Can I see the change as a diff, not as prose?&lt;/strong&gt;&lt;br&gt;
If the only thing you get is a summary, you are reviewing a claim, not code. Ask for the diff first. Everything after this line only matters if this one is true.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;2. Do I know which directory the agent was in?&lt;/strong&gt;&lt;br&gt;
Ambiguous working directories are the root cause of a surprising number of "it edited the wrong file" incidents. Pin the path explicitly and make it part of the job record.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;3. Is the change isolated to a ref I can check out?&lt;/strong&gt;&lt;br&gt;
A branch or a worktree means you can test the change yourself, and revert is one command. If the agent mutated your working tree in place, you have already lost the ability to compare. There is a full walkthrough of the worktree approach in the &lt;a href="https://docs.thandoff.com/tutorials/worktree-session" rel="noopener noreferrer"&gt;worktree session tutorial&lt;/a&gt;.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;4. Which commands did it run, and did any of them touch the network?&lt;/strong&gt;&lt;br&gt;
Install scripts, dependency bumps and &lt;code&gt;curl | sh&lt;/code&gt; are where the sharp edges live. Log tool activity, not just the final text.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;5. Where did the credentials come from?&lt;/strong&gt;&lt;br&gt;
If the agent needed a private remote, the token should be scoped to that host and short-lived where possible. Broad credentials handed to an autonomous process is how a small mistake becomes an incident — see &lt;a href="https://docs.thandoff.com/security/git-credentials" rel="noopener noreferrer"&gt;git credentials&lt;/a&gt;.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;6. Can a second person reproduce the run?&lt;/strong&gt;&lt;br&gt;
Same image, same runtime, same starting commit. If reproducing it takes a verbal explanation, it is not a process yet.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;7. What stopped it?&lt;/strong&gt;&lt;br&gt;
Time limit, token limit, an approval gate, or completion — you should be able to tell from the session state alone. Getting the states named unambiguously is worth doing early; a shared &lt;a href="https://docs.thandoff.com/reference/status-glossary" rel="noopener noreferrer"&gt;status glossary&lt;/a&gt; removes a lot of ambiguity from handoffs.&lt;/p&gt;

&lt;h2&gt;
  
  
  What this implies about your setup
&lt;/h2&gt;

&lt;p&gt;Once you write the checklist down, the requirements fall out almost mechanically:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;sessions need an explicit working directory and state,&lt;/li&gt;
&lt;li&gt;workspaces need to be disposable and isolated, so a bad run cannot poison the next one (&lt;a href="https://docs.thandoff.com/instances/" rel="noopener noreferrer"&gt;instances&lt;/a&gt;),&lt;/li&gt;
&lt;li&gt;Git review needs to be native, not bolted on (&lt;a href="https://docs.thandoff.com/workspace/repository" rel="noopener noreferrer"&gt;repository workspace&lt;/a&gt;),&lt;/li&gt;
&lt;li&gt;automations that repeat a routine need their own audit trail (&lt;a href="https://docs.thandoff.com/automation/" rel="noopener noreferrer"&gt;automation&lt;/a&gt;, &lt;a href="https://docs.thandoff.com/automation/actions" rel="noopener noreferrer"&gt;actions&lt;/a&gt;),&lt;/li&gt;
&lt;li&gt;and the whole thing has to run where the code runs, or the credential question answers itself badly.&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  The uncomfortable part
&lt;/h2&gt;

&lt;p&gt;Most of this checklist exists because I did the opposite first. I let an agent work directly in a checkout I cared about, reviewed the summary, and merged. It worked — for about three weeks. The failure was not a dramatic bug; it was a dependency change nobody noticed until a deploy.&lt;/p&gt;

&lt;p&gt;Since then I run every agent task in a disposable workspace, with the diff as the deliverable. That workflow is what I packaged as &lt;a href="https://github.com/edgestorage/task-handoff" rel="noopener noreferrer"&gt;TaskHandoff&lt;/a&gt;: a self-hosted control plane where each task gets its own Local or Docker workspace, sessions are reviewable, and Git changes arrive as a branch or worktree you can test. Apache-2.0, and the docs start at &lt;a href="https://docs.thandoff.com/" rel="noopener noreferrer"&gt;docs.thandoff.com&lt;/a&gt; (&lt;a href="https://docs.thandoff.com/guide/install" rel="noopener noreferrer"&gt;installation&lt;/a&gt;, &lt;a href="https://docs.thandoff.com/faq" rel="noopener noreferrer"&gt;FAQ&lt;/a&gt;).&lt;/p&gt;

&lt;p&gt;What is on your checklist? I am particularly curious whether people gate on cost, on network access, or on the diff size.&lt;/p&gt;

</description>
      <category>ai</category>
      <category>opensource</category>
      <category>codequality</category>
      <category>devtools</category>
    </item>
    <item>
      <title>Self-hosting an AI coding agent workbench: running Codex on my own machines</title>
      <dc:creator>EdgeStorage</dc:creator>
      <pubDate>Mon, 14 Sep 2026 17:34:57 +0000</pubDate>
      <link>https://dev.to/edgestorage/self-hosting-an-ai-coding-agent-workbench-running-codex-on-my-own-machines-58fc</link>
      <guid>https://dev.to/edgestorage/self-hosting-an-ai-coding-agent-workbench-running-codex-on-my-own-machines-58fc</guid>
      <description>&lt;p&gt;Most AI coding assistants assume you are fine sending your repository somewhere else. For side projects that is a reasonable trade. For anything with a client contract, an internal service, or a repository you cannot move, it is not.&lt;/p&gt;

&lt;p&gt;The interesting shift of the last year is that the &lt;em&gt;agent&lt;/em&gt; part has become a commodity — Codex, OpenCode, Claude Code and friends all expose a CLI you can run yourself. What is still missing for most teams is everything &lt;em&gt;around&lt;/em&gt; the agent: where does it run, which filesystem does it see, who reviews the diff, and how do you run the same routine twice without re-explaining it from scratch.&lt;/p&gt;

&lt;p&gt;I have been building that layer for a while. Here is the model that ended up working for me, and the concrete pieces you need if you want to reproduce it.&lt;/p&gt;

&lt;h2&gt;
  
  
  1. Separate the control plane from the machine that runs the agent
&lt;/h2&gt;

&lt;p&gt;The mistake I made first was treating "the agent" as the single thing to manage. In practice there are three distinct things:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;a &lt;strong&gt;control plane&lt;/strong&gt; that owns identity, sessions and routing,&lt;/li&gt;
&lt;li&gt;one or more &lt;strong&gt;nodes&lt;/strong&gt; — your laptop, a home server, a cheap VPS — that can actually execute work,&lt;/li&gt;
&lt;li&gt;a set of &lt;strong&gt;workspaces&lt;/strong&gt; that give each task an isolated filesystem and process tree.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Once those are three separate concepts, everything else gets easier. A session is not "a chat window", it is a job with an owner, a working directory, a runtime and a status. You can list it, resume it, hand it to a colleague, or kill it.&lt;/p&gt;

&lt;p&gt;If you want the shape of that in practice, the &lt;a href="https://docs.thandoff.com/guide/first-setup" rel="noopener noreferrer"&gt;first setup guide&lt;/a&gt; walks the control-plane/node split end to end, and &lt;a href="https://docs.thandoff.com/integrations/remote-nodes" rel="noopener noreferrer"&gt;remote nodes&lt;/a&gt; covers what it takes to attach a second machine — the interesting part is that node enrollment is a token, not a VPN, so a box behind NAT is reachable without exposing your whole network.&lt;/p&gt;

&lt;h2&gt;
  
  
  2. One workspace per task, not per conversation
&lt;/h2&gt;

&lt;p&gt;The second change was moving from "one container per project" to "one workspace per task". A task workspace is disposable: it gets a working directory, a defined runtime, and a bounded life. Two agents working on the same repository in parallel stop stepping on each other's files, and cleaning up is a delete rather than an archaeology exercise.&lt;/p&gt;

&lt;p&gt;That works with either a local runtime (run directly on the host, reuse the tools you already have installed) or a Docker runtime (each workspace in its own container). I default to Docker for anything that installs dependencies, and local for repositories where I want the host toolchain.&lt;/p&gt;

&lt;p&gt;See &lt;a href="https://docs.thandoff.com/instances/" rel="noopener noreferrer"&gt;instances&lt;/a&gt; for how workspaces are created and restored, and &lt;a href="https://docs.thandoff.com/workspace/repository" rel="noopener noreferrer"&gt;workspace: repository&lt;/a&gt; if you want the Git side of it.&lt;/p&gt;

&lt;h2&gt;
  
  
  3. Make the agent's output reviewable, not just readable
&lt;/h2&gt;

&lt;p&gt;A terminal scrollback is a terrible review artifact. What I want after an agent finishes is:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;the diff, in a form I can read like a pull request,&lt;/li&gt;
&lt;li&gt;the commands it actually ran,&lt;/li&gt;
&lt;li&gt;a branch or worktree I can check out and test myself.&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;The practical trick is to have the agent deliver onto a separate ref instead of mutating your working tree. Worktrees are the cheapest version of that: the agent works on its own checkout, &lt;code&gt;git diff&lt;/code&gt; shows you exactly what happened, and merging is a normal Git operation. There is a walkthrough of that workflow in the &lt;a href="https://docs.thandoff.com/tutorials/worktree-session" rel="noopener noreferrer"&gt;worktree session tutorial&lt;/a&gt;.&lt;/p&gt;

&lt;p&gt;If the agent needs to pull a private dependency, the credentials question comes up immediately. Scope the token to the specific remote, use it for provisioning, and keep it out of the agent's environment where possible — &lt;a href="https://docs.thandoff.com/security/git-credentials" rel="noopener noreferrer"&gt;git credentials&lt;/a&gt; goes into that in more detail than is comfortable.&lt;/p&gt;

&lt;h2&gt;
  
  
  4. Automate the routines you repeat
&lt;/h2&gt;

&lt;p&gt;After a few weeks you notice you are running the same sequence over and over: pull, update a lockfile, run the test suite, fix the lint, open a branch. That is where a small automation layer pays for itself. I ended up with four primitives that compose:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;documents&lt;/strong&gt; — the instructions, versioned,&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;triggers&lt;/strong&gt; — what starts it (schedule, webhook, manual),&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;actions&lt;/strong&gt; — what it does (run a session, run a command, notify),&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;schedules&lt;/strong&gt; — when.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Once those exist you stop pasting the same prompt and start reviewing output instead. The &lt;a href="https://docs.thandoff.com/automation/" rel="noopener noreferrer"&gt;automation docs&lt;/a&gt; cover the model, and &lt;a href="https://docs.thandoff.com/automation/actions" rel="noopener noreferrer"&gt;actions&lt;/a&gt; is the part with the sharp edges.&lt;/p&gt;

&lt;h2&gt;
  
  
  What I would tell someone starting today
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;Run the agent where the code lives. Latency is the least of your problems; data residency and filesystem access are the real ones.&lt;/li&gt;
&lt;li&gt;Give every task a disposable workspace. It removes an entire class of "which file did it overwrite" bugs.&lt;/li&gt;
&lt;li&gt;Make the agent deliver a diff, not a summary. Reviewing summaries is how you end up trusting a black box.&lt;/li&gt;
&lt;li&gt;Automate only after you have run the routine manually three times.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;If you want to try this shape without assembling it yourself, this is exactly what I have been packaging as &lt;a href="https://github.com/edgestorage/task-handoff" rel="noopener noreferrer"&gt;TaskHandoff&lt;/a&gt; — a self-hosted control plane for AI coding agents, Apache-2.0, with local and remote nodes, per-task Local or Docker workspaces, Codex and OpenCode sessions, Git review, and scheduled automation. Start with &lt;a href="https://docs.thandoff.com/guide/install" rel="noopener noreferrer"&gt;installation&lt;/a&gt;, or skim the &lt;a href="https://docs.thandoff.com/faq" rel="noopener noreferrer"&gt;FAQ&lt;/a&gt; if you are wondering whether it needs Docker or a public IP.&lt;/p&gt;

&lt;p&gt;The docs are at &lt;strong&gt;&lt;a href="https://docs.thandoff.com/" rel="noopener noreferrer"&gt;docs.thandoff.com&lt;/a&gt;&lt;/strong&gt; (also in &lt;a href="https://docs.thandoff.com/" rel="noopener noreferrer"&gt;Chinese&lt;/a&gt; — the site is bilingual, add &lt;code&gt;/en/&lt;/code&gt; for the English tree).&lt;/p&gt;

&lt;p&gt;What is your setup? Are you running agents on your laptop, a home lab box, or somewhere properly boring like a VPS? I am curious which of the three layers above people are missing.&lt;/p&gt;

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