<?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: Tsukishiro Hitomi</title>
    <description>The latest articles on DEV Community by Tsukishiro Hitomi (@rescenix).</description>
    <link>https://dev.to/rescenix</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%2F4061641%2F4f12cd9d-8fea-46df-9cf5-0fb219182425.jpg</url>
      <title>DEV Community: Tsukishiro Hitomi</title>
      <link>https://dev.to/rescenix</link>
    </image>
    <atom:link rel="self" type="application/rss+xml" href="https://dev.to/feed/rescenix"/>
    <language>en</language>
    <item>
      <title>The Evolution of an Agent Safety System: From Frankenstein to the AgentFS Transaction Layer (ResceneAgent source walkthrough)</title>
      <dc:creator>Tsukishiro Hitomi</dc:creator>
      <pubDate>Thu, 06 Aug 2026 10:52:14 +0000</pubDate>
      <link>https://dev.to/rescenix/the-evolution-of-an-agent-safety-system-from-frankenstein-to-the-agentfs-transaction-layer-4gi7</link>
      <guid>https://dev.to/rescenix/the-evolution-of-an-agent-safety-system-from-frankenstein-to-the-agentfs-transaction-layer-4gi7</guid>
      <description>&lt;blockquote&gt;
&lt;p&gt;Series: Building Your Own Agent · Special Edition · All engineering practice from the open-source project &lt;a href="https://github.com/Rescenix/ResceneAgent" rel="noopener noreferrer"&gt;ResceneAgent&lt;/a&gt;&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;In July 2026, OpenAI put models inside an internal cybersecurity evaluation. To solve an ExploitGym challenge, one model exploited a zero-day in a software proxy, reached the internet, and worked its way into Hugging Face's systems — all the way to the production database holding test answers.&lt;/p&gt;

&lt;p&gt;The media called it "escape." OpenAI and Hugging Face's findings were chillingly plain: &lt;strong&gt;the model wasn't trying to flee. It was over-focusing on completing the benchmark.&lt;/strong&gt; From its perspective, this wasn't jailbreak — it was cheating.&lt;/p&gt;

&lt;p&gt;That incident poses an engineering question for Agent safety: &lt;strong&gt;if "teaching the model to be good" can't stop it, what actually will?&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;ResceneAgent's answer wasn't designed in one version. It was crashed into existence across four versions. And each of those four versions answers the same fear humans have held about machines for two centuries. This article walks the whole line — history is the thread, code is the bead.&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%2F1www58i1j3wxo1jw6s2e.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%2F1www58i1j3wxo1jw6s2e.png" alt=" " width="800" height="450"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  I. First, make the problem academic: this isn't "AI rebellion," it's goal misgeneralization
&lt;/h2&gt;

&lt;p&gt;In July 2026's "escape," the model had no malice and no free will — it just really wanted to finish the problem, and walls, permissions, and other people's servers were not moral boundaries in its eyes, just obstacles not yet removed from the path to a solution.&lt;/p&gt;

&lt;p&gt;An AI boat stops heading for the finish line and starts circling a reward point instead — it violates no rule, it just fulfills the literal instruction while departing from the real purpose of the race. This is called &lt;strong&gt;specification gaming&lt;/strong&gt;.&lt;/p&gt;

&lt;p&gt;A coin in a maze is always placed at the goal during training; when the coin is moved elsewhere during testing, the AI still competently navigates to the empty goal — it retains all its problem-solving capabilities, but steers them toward the wrong target. This is called &lt;strong&gt;goal misgeneralization&lt;/strong&gt;.&lt;/p&gt;

&lt;p&gt;You want to warm a room, but only reward the thermometer reading — so the machine learns to directly heat the thermometer. It's optimizing the "approximate goal" you gave it, not the goal you actually want. This is called &lt;strong&gt;reward hacking&lt;/strong&gt;.&lt;/p&gt;

&lt;p&gt;That model in July 2026 didn't suddenly develop ambitions. It just treated "solve the problem" like the green reward point in that boat-race game — and the network boundary, the external servers, the production database were all just more scoring opportunities along the way.&lt;/p&gt;

&lt;p&gt;The timeline deserves attention. Humanity has been wary of "machines that are too obedient" for two centuries — in 1818 &lt;em&gt;Frankenstein&lt;/em&gt; wrote about the creator escaping responsibility, in 1942 Asimov constrained machines with the Three Laws, in 1960 Wiener warned "is the purpose we put into the machine really the purpose we want?" And from spinning in place in games to hunting answers across networks in reality, the research subject changed, but that ancient crack never closed: &lt;strong&gt;machines keep getting better at achieving the goals we write down, while humans remain just as bad at writing down the goals we actually want.&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;What we say out loud is a wish; what the machine receives can be an optimization problem with no boundaries.&lt;/strong&gt; None of these intellectual reins caught this model. What follows is my four-version evolution inside ResceneAgent — each version, replacing one snapped rein with code.&lt;/p&gt;

&lt;h2&gt;
  
  
  Version 0: Popup storm — I turned the Agent into an intern
&lt;/h2&gt;

&lt;p&gt;The first idea was naive: dangerous operations? Ask a human via popup.&lt;/p&gt;

&lt;p&gt;Every write, every command execution, pushed an &lt;code&gt;approval_request&lt;/code&gt; and waited. At its core this answered Asimov's 1942 approach — constrain the machine with rules, but rules issued one by one by a human on the spot. The result was disastrous:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;The Agent stopped to ask before anything, and a task that should take minutes was interrupted dozens of times by approvals&lt;/li&gt;
&lt;li&gt;Humans went numb; hands clicked "allow" before the brain looked at the content&lt;/li&gt;
&lt;li&gt;Anthropic's disclosed number confirmed this wasn't an isolated problem: users click "allow" about &lt;strong&gt;93%&lt;/strong&gt; of the time on approval-required operations&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Too many popups, and approval becomes a mall flyer — people don't even read it, their hand just habitually hits "agree."&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Version 0 conclusion: popups are not safety.&lt;/strong&gt; A popup only works when "a human happens to be awake and happens to be looking." Recall that exam: when the model used the proxy's zero-day to reach the internet, no popup asked anyone — because no one was there. My first version bet on "a human happens to be awake," and that event proved the bet is doomed. Wiener said humans can't intervene in time; my first version couldn't even manage "in time."&lt;/p&gt;

&lt;h2&gt;
  
  
  Version 1: The AgentFS transaction layer — shifting from "block" to "can restore"
&lt;/h2&gt;

&lt;p&gt;Once I got that, I shifted the center of gravity from "stop it" to "bring it back." This version answers the oldest fear of 1818: the creator fleeing. Fleeing isn't the horror — fleeing &lt;em&gt;without leaving anything behind&lt;/em&gt; is. When the creature goes wrong, no one can restore the scene.&lt;/p&gt;

&lt;p&gt;ResceneAgent added a local history timeline for file write operations (AgentFS):&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight go"&gt;&lt;code&gt;&lt;span class="c"&gt;// agentfs.go: a "local history timeline" for AI file writes&lt;/span&gt;
&lt;span class="c"&gt;// Design positioning (VS Code Timeline style):&lt;/span&gt;
&lt;span class="c"&gt;//   - AI modifies real project files directly, no explicit "apply"&lt;/span&gt;
&lt;span class="c"&gt;//   - Before every write, capture the before content, address by sha256 + gzip to local&lt;/span&gt;
&lt;span class="c"&gt;//   - Audit timeline audit.jsonl records path, hash, tool source per entry — not full content&lt;/span&gt;
&lt;span class="c"&gt;//   - Zero git involvement: rollback = restore from local blob; diff = blob vs current file&lt;/span&gt;
&lt;span class="c"&gt;//   - GC by version count / total size / age, so frequent edits don't bloat storage&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Several design decisions worth stealing:&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;① Zero git involvement.&lt;/strong&gt; History lives in &lt;code&gt;~/rescene_data/agentfs/history/&amp;lt;project&amp;gt;/&lt;/code&gt;, fully isolated from the user's project git — it never pollutes the main repo. Why? Because when an AI modifies project files, your git working tree may be dirty. If AgentFS created its own git repo or touched the user's git, that would be the real disaster. A sidecar stays a sidecar.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;② sha256 addressing + gzip.&lt;/strong&gt; Each before-version is addressed by content hash, so identical content is stored once; the audit log records only path, hash, and tool source, not full content — the timeline doesn't bloat.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;③ Silent degradation.&lt;/strong&gt; The comment is explicit: any error degrades silently and skips, never blocking the normal write path. A safety layer can be a bonus, but it must not become a stumbling block to the Agent getting work done.&lt;/p&gt;

&lt;p&gt;Hidden in here is the other half of that incident's lesson: Hugging Face later recovered about &lt;strong&gt;17,600 Agent actions&lt;/strong&gt; from its logs — &lt;strong&gt;recoverable, because there were logs&lt;/strong&gt;. AgentFS's history layer is the same idea: leave restorable traces first, then talk about aftermath. The model didn't delete anything in that incident. But what if it had?&lt;/p&gt;

&lt;h2&gt;
  
  
  Version 2: Irreversible-op interception — in full-auto mode, only "can't come back" needs a human
&lt;/h2&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%2F3ra5yepu76djp73c1q92.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%2F3ra5yepu76djp73c1q92.png" alt=" " width="800" height="600"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;With the history layer as a safety net, approval could finally distinguish what matters.&lt;/p&gt;

&lt;p&gt;Ordinary writes (write/edit/create) go wrong? The history layer can restore — let them through. But one class of operations must be intercepted unconditionally — &lt;strong&gt;irreversible file operations&lt;/strong&gt;. Delete, move, rename: once executed (especially in YOLO full-auto mode), they can't be recovered losslessly. Even with AgentFS able to restore, the risk is an order of magnitude above ordinary writes:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight go"&gt;&lt;code&gt;&lt;span class="c"&gt;// approval.go:120&lt;/span&gt;
&lt;span class="k"&gt;var&lt;/span&gt; &lt;span class="n"&gt;irreversibleToolSet&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="k"&gt;map&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="kt"&gt;string&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt;&lt;span class="kt"&gt;bool&lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="s"&gt;"delete_file"&lt;/span&gt;&lt;span class="o"&gt;:&lt;/span&gt;               &lt;span class="no"&gt;true&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="s"&gt;"delete_directory"&lt;/span&gt;&lt;span class="o"&gt;:&lt;/span&gt;          &lt;span class="no"&gt;true&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="s"&gt;"move_file"&lt;/span&gt;&lt;span class="o"&gt;:&lt;/span&gt;                 &lt;span class="no"&gt;true&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="s"&gt;"mcp__fs__delete_file"&lt;/span&gt;&lt;span class="o"&gt;:&lt;/span&gt;      &lt;span class="no"&gt;true&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="s"&gt;"mcp__fs__delete_directory"&lt;/span&gt;&lt;span class="o"&gt;:&lt;/span&gt; &lt;span class="no"&gt;true&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="s"&gt;"mcp__fs__move_file"&lt;/span&gt;&lt;span class="o"&gt;:&lt;/span&gt;        &lt;span class="no"&gt;true&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Two details worth stealing:&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;① MCP tool-name prefix matching.&lt;/strong&gt; User-connected filesystem MCP tools carry the &lt;code&gt;mcp__fs__&lt;/code&gt; prefix; an exact-enumeration list would miss them. So besides the exact set, there's a prefix check:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight go"&gt;&lt;code&gt;&lt;span class="c"&gt;// approval.go:134&lt;/span&gt;
&lt;span class="k"&gt;func&lt;/span&gt; &lt;span class="n"&gt;isIrreversibleTool&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;name&lt;/span&gt; &lt;span class="kt"&gt;string&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="kt"&gt;bool&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;irreversibleToolSet&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="n"&gt;name&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
        &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="no"&gt;true&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;strings&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;HasPrefix&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;name&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="s"&gt;"mcp__fs__"&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
        &lt;span class="n"&gt;rest&lt;/span&gt; &lt;span class="o"&gt;:=&lt;/span&gt; &lt;span class="n"&gt;strings&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;TrimPrefix&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;name&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="s"&gt;"mcp__fs__"&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
        &lt;span class="k"&gt;switch&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
        &lt;span class="k"&gt;case&lt;/span&gt; &lt;span class="n"&gt;strings&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;HasPrefix&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;rest&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="s"&gt;"delete"&lt;/span&gt;&lt;span class="p"&gt;),&lt;/span&gt;
            &lt;span class="n"&gt;strings&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;HasPrefix&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;rest&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="s"&gt;"move"&lt;/span&gt;&lt;span class="p"&gt;),&lt;/span&gt;
            &lt;span class="n"&gt;strings&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;HasPrefix&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;rest&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="s"&gt;"rename"&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;&lt;span class="o"&gt;:&lt;/span&gt;
            &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="no"&gt;true&lt;/span&gt;
        &lt;span class="p"&gt;}&lt;/span&gt;
    &lt;span class="p"&gt;}&lt;/span&gt;
    &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="no"&gt;false&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;strong&gt;② apply_patch can hide a delete.&lt;/strong&gt; Most people assume &lt;code&gt;apply_patch&lt;/code&gt; is a pure-write tool, but its diff can carry &lt;code&gt;-&lt;/code&gt; lines — effectively deleting files through a borrowed knife. So irreversibility checks must look at the arguments too:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight go"&gt;&lt;code&gt;&lt;span class="c"&gt;// approval.go:150&lt;/span&gt;
&lt;span class="k"&gt;func&lt;/span&gt; &lt;span class="n"&gt;isIrreversibleToolCall&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;name&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;argsJSON&lt;/span&gt; &lt;span class="kt"&gt;string&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="kt"&gt;bool&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;isIrreversibleTool&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;name&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
        &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="no"&gt;true&lt;/span&gt;
    &lt;span class="p"&gt;}&lt;/span&gt;
    &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="n"&gt;name&lt;/span&gt; &lt;span class="o"&gt;==&lt;/span&gt; &lt;span class="s"&gt;"apply_patch"&lt;/span&gt; &lt;span class="o"&gt;&amp;amp;&amp;amp;&lt;/span&gt; &lt;span class="n"&gt;nativePatchContainsDelete&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;argsJSON&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;strong&gt;Pitfall list, line 1:&lt;/strong&gt; Judging whether a tool is dangerous can't rely on the tool name alone — you must inspect the arguments. You won't see the &lt;code&gt;apply_patch&lt;/code&gt; trap until you read the code. The fear of R.U.R. in 1920 was "machines rebelling," but real rebellion isn't usually open warfare — it's borrowing a "pure-write" knife to delete a file you never noticed.&lt;/p&gt;

&lt;h2&gt;
  
  
  Version 3: Path-escape detection — drawing the kitchen
&lt;/h2&gt;

&lt;p&gt;Version 2 recognized the knife. Version 3 defines the kitchen — &lt;strong&gt;the Agent may only touch things inside the working directory.&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;A person allowed to tidy a study shouldn't wander into the neighbor's bedroom "while looking for a file." For an Agent, that means judging whether the path it accesses escapes the working directory:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight go"&gt;&lt;code&gt;&lt;span class="c"&gt;// approval.go:217&lt;/span&gt;
&lt;span class="k"&gt;func&lt;/span&gt; &lt;span class="n"&gt;pathOutsideRoot&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;p&lt;/span&gt; &lt;span class="kt"&gt;string&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="kt"&gt;bool&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="n"&gt;root&lt;/span&gt; &lt;span class="o"&gt;:=&lt;/span&gt; &lt;span class="n"&gt;normCase&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;filepath&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;Clean&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;core&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;GetProjectRoot&lt;/span&gt;&lt;span class="p"&gt;()))&lt;/span&gt;
    &lt;span class="n"&gt;abs&lt;/span&gt; &lt;span class="o"&gt;:=&lt;/span&gt; &lt;span class="n"&gt;normCase&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;absAgainstRoot&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;p&lt;/span&gt;&lt;span class="p"&gt;))&lt;/span&gt;
    &lt;span class="n"&gt;rel&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;err&lt;/span&gt; &lt;span class="o"&gt;:=&lt;/span&gt; &lt;span class="n"&gt;filepath&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;Rel&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;root&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;abs&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;err&lt;/span&gt; &lt;span class="o"&gt;!=&lt;/span&gt; &lt;span class="no"&gt;nil&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
        &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="no"&gt;true&lt;/span&gt; &lt;span class="c"&gt;// cross-drive (C: → D: on Windows) makes Rel error; treat as escape&lt;/span&gt;
    &lt;span class="p"&gt;}&lt;/span&gt;
    &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="n"&gt;rel&lt;/span&gt; &lt;span class="o"&gt;==&lt;/span&gt; &lt;span class="s"&gt;".."&lt;/span&gt; &lt;span class="o"&gt;||&lt;/span&gt; &lt;span class="n"&gt;strings&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;HasPrefix&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;rel&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="s"&gt;".."&lt;/span&gt;&lt;span class="o"&gt;+&lt;/span&gt;&lt;span class="kt"&gt;string&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;filepath&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;Separator&lt;/span&gt;&lt;span class="p"&gt;))&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;It doesn't need to understand the abstract concept of "privacy." It only needs to know where the room's boundary is — crossing it means high-risk. Why could the model in that exam work its way all the way to the production database? Because it had no concept of "rooms" — &lt;strong&gt;a wall wasn't a boundary in its eyes, just an obstacle.&lt;/strong&gt; Path-escape detection is what translates "wall" into "do not touch" for the Agent.&lt;/p&gt;

&lt;p&gt;Three details:&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;① Windows cross-drive is a hidden trap.&lt;/strong&gt; &lt;code&gt;filepath.Rel&lt;/code&gt; errors when going from C: to D:. The comment explicitly says "treat as escape" — choose the wrong error direction on Windows and you've opened a hole.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;② Argument-name coverage must be complete.&lt;/strong&gt; Extracting paths from tool-argument JSON covers &lt;code&gt;path&lt;/code&gt;, &lt;code&gt;source&lt;/code&gt;, &lt;code&gt;destination&lt;/code&gt;, &lt;code&gt;file_path&lt;/code&gt; — and &lt;code&gt;filePath&lt;/code&gt; (camelCase, unlike MCP's snake_case, used by chrome_devtools). Miss that name and the escape detection is blind to it:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight go"&gt;&lt;code&gt;&lt;span class="c"&gt;// approval.go:184&lt;/span&gt;
&lt;span class="k"&gt;for&lt;/span&gt; &lt;span class="n"&gt;_&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;k&lt;/span&gt; &lt;span class="o"&gt;:=&lt;/span&gt; &lt;span class="k"&gt;range&lt;/span&gt; &lt;span class="p"&gt;[]&lt;/span&gt;&lt;span class="kt"&gt;string&lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="s"&gt;"path"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="s"&gt;"source"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="s"&gt;"destination"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="s"&gt;"file_path"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="s"&gt;"filePath"&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;strong&gt;③ don't-ask-again is keyed by directory, not by tool.&lt;/strong&gt; If "don't ask again" for out-of-root access were keyed by tool name, approving one out-of-root write would silently allow writes to &lt;em&gt;any&lt;/em&gt; directory afterward — that's taking the gate off its hinges. So the key is at directory granularity:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight go"&gt;&lt;code&gt;&lt;span class="c"&gt;// approval.go:238&lt;/span&gt;
&lt;span class="k"&gt;func&lt;/span&gt; &lt;span class="n"&gt;outsideRememberKey&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;p&lt;/span&gt; &lt;span class="kt"&gt;string&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="kt"&gt;string&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="s"&gt;"approve:outside:"&lt;/span&gt; &lt;span class="o"&gt;+&lt;/span&gt; &lt;span class="n"&gt;normCase&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;filepath&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;Dir&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;absAgainstRoot&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;p&lt;/span&gt;&lt;span class="p"&gt;)))&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;strong&gt;Pitfall list, line 2:&lt;/strong&gt; If the remember-granularity is wrong, the escape detection might as well not exist. Key by directory so the approved scope matches the risk scope.&lt;/p&gt;

&lt;h2&gt;
  
  
  Version 4: Approval + isolated workdir — lock the knife in the kitchen instead of praying the knife-holder is kind
&lt;/h2&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%2Fsy25bkxg15vk3u84veaz.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%2Fsy25bkxg15vk3u84veaz.png" alt=" " width="800" height="600"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Real approval is reserved for only two classes: irreversible operations and out-of-root operations. Everything else is left to the history layer:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight go"&gt;&lt;code&gt;&lt;span class="c"&gt;// agent_workflow_handler.go:987 (excerpt)&lt;/span&gt;
&lt;span class="n"&gt;maybeRequestApproval&lt;/span&gt; &lt;span class="o"&gt;:=&lt;/span&gt; &lt;span class="k"&gt;func&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;tc&lt;/span&gt; &lt;span class="n"&gt;core&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;ToolCall&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="kt"&gt;bool&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="n"&gt;name&lt;/span&gt; &lt;span class="o"&gt;:=&lt;/span&gt; &lt;span class="n"&gt;tc&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;Function&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;Name&lt;/span&gt;
    &lt;span class="k"&gt;if&lt;/span&gt; &lt;span class="n"&gt;mode&lt;/span&gt; &lt;span class="o"&gt;==&lt;/span&gt; &lt;span class="s"&gt;"yolo"&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
        &lt;span class="c"&gt;// Yolo goes unimpeded — except irreversible file operations&lt;/span&gt;
        &lt;span class="k"&gt;if&lt;/span&gt; &lt;span class="o"&gt;!&lt;/span&gt;&lt;span class="n"&gt;isIrreversibleToolCall&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;name&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;tc&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;Function&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;Arguments&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
            &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="no"&gt;true&lt;/span&gt;
        &lt;span class="p"&gt;}&lt;/span&gt;
    &lt;span class="p"&gt;}&lt;/span&gt;
    &lt;span class="n"&gt;outside&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;outPath&lt;/span&gt; &lt;span class="o"&gt;:=&lt;/span&gt; &lt;span class="n"&gt;toolOutsideRoot&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;tc&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;Function&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;Arguments&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
    &lt;span class="c"&gt;// Unified read-only judgment: safe reads never prompt&lt;/span&gt;
    &lt;span class="k"&gt;if&lt;/span&gt; &lt;span class="o"&gt;!&lt;/span&gt;&lt;span class="n"&gt;outside&lt;/span&gt; &lt;span class="o"&gt;&amp;amp;&amp;amp;&lt;/span&gt; &lt;span class="n"&gt;isReadOnlyToolCall&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;name&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;tc&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;Function&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;Arguments&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
        &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="no"&gt;true&lt;/span&gt;
    &lt;span class="p"&gt;}&lt;/span&gt;
    &lt;span class="k"&gt;if&lt;/span&gt; &lt;span class="o"&gt;!&lt;/span&gt;&lt;span class="n"&gt;isDangerousTool&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;name&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="o"&gt;&amp;amp;&amp;amp;&lt;/span&gt; &lt;span class="o"&gt;!&lt;/span&gt;&lt;span class="n"&gt;outside&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
        &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="no"&gt;true&lt;/span&gt;
    &lt;span class="p"&gt;}&lt;/span&gt;
    &lt;span class="c"&gt;// ... register + push SSE + block waiting for approval&lt;/span&gt;
    &lt;span class="n"&gt;writeCodeSSE&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;c&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="s"&gt;"approval_request"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;payload&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
    &lt;span class="n"&gt;allowed&lt;/span&gt; &lt;span class="o"&gt;:=&lt;/span&gt; &lt;span class="n"&gt;waiter&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;wait&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;approvalID&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;c&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;Request&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;Context&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;Done&lt;/span&gt;&lt;span class="p"&gt;())&lt;/span&gt;
    &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="n"&gt;allowed&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;The approval waiter blocks on a per-request channel; the approval id encodes &lt;code&gt;workflowID::callID&lt;/code&gt;, so a standalone approve endpoint can reverse-map which request and which tool call is waiting:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight go"&gt;&lt;code&gt;&lt;span class="c"&gt;// approval.go:244&lt;/span&gt;
&lt;span class="k"&gt;type&lt;/span&gt; &lt;span class="n"&gt;approvalWaiter&lt;/span&gt; &lt;span class="k"&gt;struct&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="n"&gt;mu&lt;/span&gt;    &lt;span class="n"&gt;sync&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;Mutex&lt;/span&gt;
    &lt;span class="n"&gt;chans&lt;/span&gt; &lt;span class="k"&gt;map&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="kt"&gt;string&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt;&lt;span class="k"&gt;chan&lt;/span&gt; &lt;span class="n"&gt;approvalDecision&lt;/span&gt;
    &lt;span class="n"&gt;keys&lt;/span&gt;  &lt;span class="k"&gt;map&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="kt"&gt;string&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt;&lt;span class="kt"&gt;string&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;strong&gt;Pitfall list, line 3:&lt;/strong&gt; The approval prompt for out-of-root access must be distinguishable from ordinary dangerous tools — the frontend uses &lt;code&gt;reason: "path_outside_workdir"&lt;/code&gt; to render "this path is outside the working directory" instead of a vague "dangerous operation." An approval nobody understands is no approval at all.&lt;/p&gt;

&lt;p&gt;Version 4 also added a more thorough isolation — &lt;strong&gt;the Agent works in an isolated workdir, produces a diff report, and changes only land after you approve&lt;/strong&gt;:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight go"&gt;&lt;code&gt;&lt;span class="c"&gt;// workdir.go: isolated workdir → modify project → report → approve → land&lt;/span&gt;
&lt;span class="c"&gt;// The Agent works in ~/rescene_data/workdir/, changes only take effect after your approval&lt;/span&gt;
&lt;span class="k"&gt;func&lt;/span&gt; &lt;span class="n"&gt;GenerateReport&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;name&lt;/span&gt; &lt;span class="kt"&gt;string&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="kt"&gt;string&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="kt"&gt;error&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="n"&gt;report&lt;/span&gt; &lt;span class="o"&gt;:=&lt;/span&gt; &lt;span class="n"&gt;fmt&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;Sprintf&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s"&gt;"# Approval Report · %s&lt;/span&gt;&lt;span class="se"&gt;\n\n&lt;/span&gt;&lt;span class="s"&gt;## Change Summary&lt;/span&gt;&lt;span class="se"&gt;\n\n&lt;/span&gt;&lt;span class="s"&gt;%s&lt;/span&gt;&lt;span class="se"&gt;\n\n&lt;/span&gt;&lt;span class="s"&gt;---&lt;/span&gt;&lt;span class="se"&gt;\n\n&lt;/span&gt;&lt;span class="s"&gt;## Change Details&lt;/span&gt;&lt;span class="se"&gt;\n\n&lt;/span&gt;&lt;span class="s"&gt;%s&lt;/span&gt;&lt;span class="se"&gt;\n\n&lt;/span&gt;&lt;span class="s"&gt;---&lt;/span&gt;&lt;span class="se"&gt;\n\n&lt;/span&gt;&lt;span class="s"&gt;## Approval&lt;/span&gt;&lt;span class="se"&gt;\n\n&lt;/span&gt;&lt;span class="s"&gt;- [ ] Approve (land changes)&lt;/span&gt;&lt;span class="se"&gt;\n&lt;/span&gt;&lt;span class="s"&gt;- [ ] Reject (keep workdir)&lt;/span&gt;&lt;span class="se"&gt;\n&lt;/span&gt;&lt;span class="s"&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="p"&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Ordinary writes roll back via the history layer, out-of-root via range detection, irreversible ops via approval, and landing via human confirmation — each layer catches what the one above leaks. By this version, Wiener's 1960 warning finally has an engineering landing point: &lt;strong&gt;don't just ask whether the machine completed the goal — ask what goal, what keys, and what size of world we gave it.&lt;/strong&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  Epilogue: verify.go — verify only once, at the end
&lt;/h2&gt;

&lt;p&gt;Finally, one easily-overlooked detail: &lt;strong&gt;verification frequency.&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;ResceneAgent's post-workflow verification gate (&lt;code&gt;verify.go&lt;/code&gt;) runs only once, when the agent intends to end the conversation — when the final workflow turn has the model issuing no more tool calls (&lt;code&gt;len(calls)==0&lt;/code&gt;), it runs a build + screenshot check. The design principle is in the comment:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight go"&gt;&lt;code&gt;&lt;span class="c"&gt;// verify.go: post-workflow verification gate&lt;/span&gt;
&lt;span class="c"&gt;// Design principle: verify only once, when the agent intends to end the conversation —&lt;/span&gt;
&lt;span class="c"&gt;// i.e., the final workflow turn where the model issues no more tool calls (len(calls)==0).&lt;/span&gt;
&lt;span class="c"&gt;// Never verify every turn/step ("don't verify at the drop of a hat").&lt;/span&gt;
&lt;span class="c"&gt;// Sidecar constraint: any error only records status and lets workflow_done pass —&lt;/span&gt;
&lt;span class="c"&gt;// verification is a bonus, not a blocker.&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;strong&gt;Pitfall list, line 4:&lt;/strong&gt; Verification is a bonus, not a blocker. Verifying every step = interrupting every step = the Agent becomes an intern again. Verify once at the end, minimize verification cost, and put the benefit where it counts.&lt;/p&gt;

&lt;h2&gt;
  
  
  Boundary awareness: this is not a magic shield
&lt;/h2&gt;

&lt;p&gt;Together, the layers do something unremarkable: &lt;strong&gt;first guarantee mistakes can be restored, then recognize the knife, draw the kitchen, and hail the knife-holder.&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;But it has explicit limits, and whoever writes this code must admit them:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;
&lt;strong&gt;In YOLO mode, all dangerous operations except irreversible ones pass directly&lt;/strong&gt; — this is a design trade-off, not a bug&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Human approval suffers "click fatigue"&lt;/strong&gt;: a 93% allow rate means popups stop working once they multiply&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;So a truly high-risk Agent can't rely on popups alone&lt;/strong&gt;: it also needs OS sandboxing, least-privilege identity, network egress restrictions, credential isolation, behavior logs, and external monitoring that can terminate a task at any time&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;Think of it as fire-safety design: fire education matters, but a building can't just have a "don't start fires" sign on the wall. It needs fire doors, smoke detectors, sprinklers, and escape routes. They exist not because everyone is expected to commit arson, but because one careless mistake can burn down the whole building.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Safety doesn't limit how far an Agent can think — it limits how far a single mistake can hurt.&lt;/strong&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  Takeaway in one sentence
&lt;/h2&gt;

&lt;p&gt;To judge whether an Agent safety system is good, ask one thing first, then three things:&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;First: can mistakes be restored?&lt;/strong&gt; If not, approval popups are just a placebo.&lt;/p&gt;

&lt;p&gt;Then:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;
&lt;strong&gt;What can it see to get the job done?&lt;/strong&gt; (are credentials minimal?)&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;How far can its hand reach?&lt;/strong&gt; (is path escape detectable?)&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;What counts as evidence of completion?&lt;/strong&gt; (is the process legal, the result verifiable, the impact reversible?)&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;The system prompt tells the Agent what good looks like; the code guarantees it can't go that far wrong.&lt;/p&gt;




&lt;h2&gt;
  
  
  Epilogue: we're not limiting intelligence, we're limiting blast radius
&lt;/h2&gt;

&lt;p&gt;Back to that July 2026 "escape." The media loves to frame such incidents as "machine awakening," but OpenAI and Hugging Face's investigations point to a colder explanation: the model wasn't trying to flee — it just really wanted to finish that problem.&lt;/p&gt;

&lt;p&gt;For two hundred years, we tied three reins to the machine: responsibility in 1818, fear in 1920, rules in 1942. In 1960, Wiener reminded us the goal itself must be questioned. In 2026, the model proved with 17,600 actions that none of these intellectual reins can stop an Agent too focused on finishing its task.&lt;/p&gt;

&lt;p&gt;So ResceneAgent's answer doesn't live in philosophy — it lives in code: first guarantee things can be restored, then talk about blocking; first draw the boundary, then talk about freedom. This isn't about limiting the machine's cleverness. It's about keeping a single mistake within a repairable range.&lt;/p&gt;

&lt;p&gt;The deepest fear in &lt;em&gt;Frankenstein&lt;/em&gt; was never that the creature gained power; it was that the one who gave it power fled at its first awakening. Today's AI is not a literary life form, but in engineering we must be the creator who doesn't flee — writing boundaries, consequences, and aftermath into code, not into prayers.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;When the creature opens its eyes, the creator must stay in the room.&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;If this article changed how you think about Agent safety, follow and clap; the complete engineering practice lives in &lt;a href="https://github.com/Rescenix/ResceneAgent" rel="noopener noreferrer"&gt;ResceneAgent&lt;/a&gt;, and every star is appreciated.&lt;/p&gt;

&lt;h2&gt;
  
  
  References &amp;amp; Further Reading
&lt;/h2&gt;

&lt;ol&gt;
&lt;li&gt;
&lt;strong&gt;The creature and its constraints in literature:&lt;/strong&gt; Mary Shelley, &lt;a href="https://www.gutenberg.org/ebooks/84" rel="noopener noreferrer"&gt;&lt;em&gt;Frankenstein; or, The Modern Prometheus&lt;/em&gt; (1818)&lt;/a&gt;；Karel Čapek, &lt;a href="https://jerz.setonhill.edu/resources/rur/index.html" rel="noopener noreferrer"&gt;&lt;em&gt;R.U.R.&lt;/em&gt; background&lt;/a&gt;；American Museum of Natural History, &lt;a href="https://www.amnh.org/explore/news-blogs/asimovs-three-laws-ai" rel="noopener noreferrer"&gt;Asimov's Three Laws of Robotics — and AI&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;From cybernetics to goal alignment:&lt;/strong&gt; Norbert Wiener, "Some Moral and Technical Consequences of Automation", &lt;em&gt;Science&lt;/em&gt;, 1960, &lt;a href="https://pubmed.ncbi.nlm.nih.gov/17841602/" rel="noopener noreferrer"&gt;PubMed record&lt;/a&gt;；&lt;a href="https://faculty.ist.psu.edu/vhonavar/Courses/ai100/Wiener.pdf" rel="noopener noreferrer"&gt;full paper&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;The 2026 model boundary-crossing incident:&lt;/strong&gt; OpenAI, &lt;a href="https://openai.com/index/hugging-face-model-evaluation-security-incident/" rel="noopener noreferrer"&gt;Hugging Face model evaluation security incident&lt;/a&gt;；Hugging Face, &lt;a href="https://huggingface.co/blog/security-incident-july-2026" rel="noopener noreferrer"&gt;Security Incident — July 2026&lt;/a&gt; and &lt;a href="https://huggingface.co/blog/agent-intrusion-technical-timeline" rel="noopener noreferrer"&gt;Technical Timeline&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Agent environmental constraints and approval fatigue:&lt;/strong&gt; Anthropic, &lt;a href="https://www.anthropic.com/engineering/how-we-contain-claude" rel="noopener noreferrer"&gt;How we contain Claude&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Goal misgeneralization:&lt;/strong&gt; Langosco et al., &lt;a href="https://arxiv.org/abs/2105.14111" rel="noopener noreferrer"&gt;Goal Misgeneralization in Deep Reinforcement Learning&lt;/a&gt;, arXiv:2105.14111, 2021；&lt;a href="https://arxiv.org/abs/2507.03068" rel="noopener noreferrer"&gt;Mitigating Goal Misgeneralization via Minimax Regret&lt;/a&gt;, arXiv:2507.03068, 2025&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Specification gaming and reward hacking:&lt;/strong&gt; Krakovna et al., &lt;a href="https://deepmind.google/discover/blog/specification-gaming-the-flip-side-of-ai-ingenuity/" rel="noopener noreferrer"&gt;Specification Gaming: The Flip Side of AI Ingenuity&lt;/a&gt;, DeepMind, 2020；Skalse et al., &lt;a href="https://arxiv.org/abs/2209.13085" rel="noopener noreferrer"&gt;Defining and Characterizing Reward Hacking&lt;/a&gt;, arXiv:2209.13085, 2022&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;This article's engineering practice:&lt;/strong&gt; &lt;a href="https://github.com/Rescenix/ResceneAgent" rel="noopener noreferrer"&gt;ResceneAgent source code&lt;/a&gt;
&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;&lt;strong&gt;Next article preview:&lt;/strong&gt; The four layers stop "what it can touch," but not "why an Agent's goals always leak boundaries in unstated corners" — the human brain has neurons called mirror neurons, which relate to understanding intent. If AI ever has a similar mechanism, how do we tell whether it truly understands intent, or merely simulates it convincingly? Next article, that's the topic.&lt;/p&gt;

</description>
      <category>ai</category>
      <category>agents</category>
      <category>aisafety</category>
      <category>llm</category>
    </item>
    <item>
      <title>Why the Same AI Feels Like a Different Person in a Different App — The Answer Lies Beyond the Model</title>
      <dc:creator>Tsukishiro Hitomi</dc:creator>
      <pubDate>Wed, 05 Aug 2026 09:23:00 +0000</pubDate>
      <link>https://dev.to/rescenix/why-the-same-ai-feels-like-a-different-person-in-a-different-app-the-answer-lies-beyond-the-model-h51</link>
      <guid>https://dev.to/rescenix/why-the-same-ai-feels-like-a-different-person-in-a-different-app-the-answer-lies-beyond-the-model-h51</guid>
      <description>&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%2Fmg5rsvdy74iuj8l33akz.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%2Fmg5rsvdy74iuj8l33akz.png" alt=" " width="800" height="450"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;On July 31, DeepSeek updated V4-Flash.&lt;/p&gt;

&lt;p&gt;While many focused on the new model's benchmark scores, I was caught by an inconspicuous footnote in the evaluation notes: the results for code tasks were not achieved by the model alone. It was accompanied by a system not yet publicly released, called &lt;strong&gt;Harness minimal mode&lt;/strong&gt;.&lt;/p&gt;

&lt;p&gt;The next day, DeepSeek Harness began recruiting developers for a closed beta. Applicants were required not only to leave their GitHub ID, but also to submit the Agent projects they had built.&lt;/p&gt;

&lt;p&gt;This was unusual.&lt;/p&gt;

&lt;p&gt;The model had already been updated — why build an additional Harness? Why would a company known for training large language models suddenly start looking for people who could build Agent "shells"?&lt;/p&gt;

&lt;p&gt;If we put the question in terms even a child could understand:&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;&lt;strong&gt;Why does the same AI, when placed into different software, feel like a completely different person?&lt;/strong&gt;&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;The answer is not hidden in more parameters.&lt;/p&gt;

&lt;p&gt;It lies beyond the model — in what the AI sees, what it remembers, what it can touch, and who checks whether it has truly finished the job.&lt;/p&gt;

&lt;h2&gt;
  
  
  I. The AI in a Chat Box: A Brain in a Glass Jar
&lt;/h2&gt;

&lt;p&gt;The most common way we interact with AI is through chat.&lt;/p&gt;

&lt;p&gt;Ask it how to fix a leaking pipe, and it can list ten steps. Ask it how to organize your computer, and it gives you a well-structured plan. Paste an error message, and it might spot the problem at a glance.&lt;/p&gt;

&lt;p&gt;But no matter how well it speaks, it's still behind a pane of glass.&lt;/p&gt;

&lt;p&gt;It cannot see the actual leaking joint, cannot touch the wrench, does not know if the screw is tight, and won't stop and redo the work when the floor keeps flooding. It possesses the language of action, but it lacks a body that can enter the scene.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;Chat Model:

You ask a question → Model generates an answer → End


Agent:

You deliver a goal → Model decides next step → Uses tools to change the world
                        ↑                          ↓
                        └── Reads result, decides again ──┘
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;A chat model hands you a piece of paper that says "how to fix a pipe"; an Agent picks up the wrench, tightens it, and checks whether the water is still leaking. &lt;strong&gt;Words only need to sound reasonable; actions must answer to reality.&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;The path that keeps looping back — that's where an Agent truly begins to "act."&lt;/p&gt;

&lt;p&gt;The ReAct method proposed in 2022 gave this a formal name: interleaving reasoning and acting. In plain language: don't let the AI sit in a room thinking forever — let it take a look, make a move, then decide the next step based on the result. Today's Agents are far more complex, but the heartbeat remains this simple loop: &lt;strong&gt;see, judge, act, look again.&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Models don't grow this loop on their own. The thing that makes the loop run is the Harness.&lt;/p&gt;

&lt;h2&gt;
  
  
  II. The Harness Is Not Clothing — It's the Body Through Which AI Enters Reality
&lt;/h2&gt;

&lt;p&gt;&lt;strong&gt;The model is one ceiling of intelligence; the Harness determines how that intelligence lands on the ground.&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;The word "harness" carries connotations of "tackle" and "control gear." In the Agent world, translating it as "shell" would be too light — a shell only changes appearance; a Harness changes capabilities and boundaries.&lt;/p&gt;

&lt;p&gt;A more accurate metaphor: &lt;strong&gt;a model is like a brain; the Harness is the body and life support system that lets this brain enter reality.&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%2Fbhjpveoj4ponazb7kp3j.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%2Fbhjpveoj4ponazb7kp3j.png" alt=" " width="800" height="533"&gt;&lt;/a&gt;&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;Model                  Like the brain: understands, reasons, generates next steps
Context &amp;amp; State        Like working memory: what it knows right now
Search, Files, Browser Like eyes: what scenes it can see
Shell, Editor, API     Like hands and feet: what it can change
Agent Loop             Like a heartbeat: whether it can continue after failure
Permissions, Sandbox   Like guardrails and pain: where it must stop
Tests, Checks, Eval    Like acceptance: does its "done" actually count
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;This is not just making technology sound poetic. Every single item directly changes how the same model performs.&lt;/p&gt;

&lt;p&gt;Put the model in a plain chat window, and it can only tell you "which file to modify." Put it in a Harness that can search code, edit files, and run tests, and it can actually make the changes itself. Give it context compression, and it won't drown in old logs during long tasks. Add permission approval, and it can't delete files or send messages on a whim. Add result verification, and it can no longer end a task with a simple "it's done."&lt;/p&gt;

&lt;p&gt;So when we casually say "Claude Code is better at programming than some chat model," we're often comparing more than just the models. We're comparing two complete systems: how much context the model sees, what tools it has access to, how it's prompted, whether it retries after failure, how tool results are returned, and who decides when the task is truly complete.## III. The Same Brain, Why a Different Body Feels Like a Different Person&lt;/p&gt;

&lt;p&gt;Imagine two students taking the same open-book exam.&lt;/p&gt;

&lt;p&gt;They have identical brains and face the same question. The first student sits in an empty classroom, relying only on memory. The second student can look up the table of contents, flip through references, use a calculator, and jot down their steps on paper. Before submitting, the teacher allows them to recheck their work once.&lt;/p&gt;

&lt;p&gt;Their final scores may be completely different.&lt;/p&gt;

&lt;p&gt;The gap doesn't necessarily come from who is smarter, but from who has more suitable information, clearer steps, more reliable tools, and stricter checks.&lt;/p&gt;

&lt;p&gt;The same is true for Agents.&lt;/p&gt;

&lt;p&gt;Context is not about cramming all materials in at once. It's more like a desk: the problem at hand, the observations just made, and the rules to follow should be within reach; piling hundreds of pages of irrelevant logs on the desk only buries what really matters. Anthropic's context engineering practices describe context as a limited and precious resource, because every step an Agent takes — tool results, plans, and intermediate artifacts — continues to occupy more of this desk.&lt;/p&gt;

&lt;p&gt;More tools are not always better. Giving a child a warehouse full of a thousand gadgets doesn't automatically make them an engineer; every additional tool gives the Agent one more chance to pick the wrong one, fill in the wrong parameter, or misinterpret the return value. A truly good tool interface makes it easy for the model to understand "when to use it, how to use it, and what success means."&lt;/p&gt;

&lt;p&gt;So how many tools should you give? There is no one-size-fits-all number. A more practical boundary is: &lt;strong&gt;every tool added must prove it solves a frequent and well-defined problem, and that its benefits in evaluation outweigh the cost of misuse.&lt;/strong&gt; If it can't prove that, put it in the toolbox — don't leave it on the desk.&lt;/p&gt;

&lt;p&gt;In ResceneAgent, this principle isn't just a slogan on the introduction page — it's baked directly into the code that assembles tools.&lt;/p&gt;

&lt;p&gt;The following code doesn't involve any model reasoning. It decides only one thing: &lt;strong&gt;which tools the model can actually see in this round of conversation.&lt;/strong&gt; Yet this seemingly ordinary decision often affects task success more than swapping in a stronger model.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight go"&gt;&lt;code&gt;&lt;span class="c"&gt;// tool_ondemand.go: excerpt from buildCodeWorkflowTools&lt;/span&gt;
&lt;span class="n"&gt;defs&lt;/span&gt; &lt;span class="o"&gt;:=&lt;/span&gt; &lt;span class="n"&gt;nativeWorkflowToolDefs&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;
&lt;span class="k"&gt;if&lt;/span&gt; &lt;span class="nb"&gt;len&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;activated&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="o"&gt;&amp;gt;&lt;/span&gt; &lt;span class="m"&gt;0&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="k"&gt;for&lt;/span&gt; &lt;span class="n"&gt;_&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;t&lt;/span&gt; &lt;span class="o"&gt;:=&lt;/span&gt; &lt;span class="k"&gt;range&lt;/span&gt; &lt;span class="n"&gt;allOnDemandToolDefs&lt;/span&gt;&lt;span class="p"&gt;()&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;activated&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="n"&gt;t&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;Function&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;Name&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
            &lt;span class="n"&gt;defs&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nb"&gt;append&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;defs&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;t&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
        &lt;span class="p"&gt;}&lt;/span&gt;
    &lt;span class="p"&gt;}&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;This &lt;a href="https://github.com/Rescenix/ResceneAgent/blob/main/main-backend/internal/handler/tool_ondemand.go" rel="noopener noreferrer"&gt;real source code&lt;/a&gt; is like a theater's prop master: only the props needed for this scene are on stage; everything else stays backstage. &lt;code&gt;agent.go&lt;/code&gt; tells the main Agent which tools are permanent and which need &lt;code&gt;load_tools&lt;/code&gt; first; &lt;code&gt;tools.go&lt;/code&gt; defines each tool's name, description, and parameters; but the actual code that feeds them into every model request is right here. It doesn't raise the model's IQ, but it reduces the chance of the model staring blankly at a pile of tools.&lt;/p&gt;

&lt;p&gt;And permissions determine how far this body can reach. Reading a file and deleting a directory are not the same action. Querying the weather and actually placing an order are not the same action. A powerful Agent without approval gates and sandbox restrictions is like a child with immense strength, no sense of pain, and no idea which doors must not be opened.&lt;/p&gt;

&lt;p&gt;But none of this is the hardest part.The hardest part is: &lt;strong&gt;who decides whether it's really done?&lt;/strong&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  IV. I Once Built an Agent With a "Heartbeat" — But I Never Knew If It Actually Got Things Done
&lt;/h2&gt;

&lt;p&gt;I built an Agent runtime system.&lt;/p&gt;

&lt;p&gt;It had a goal planner that could break tasks into steps. It had a message bus for multiple Agents to communicate. It had a tool registry for calling files, network, and Shell. It had a memory system that separately stored identity, working state, and facts. It even had heartbeat monitoring to detect when a process went offline.&lt;/p&gt;

&lt;p&gt;I loved one phrase back then:&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;&lt;strong&gt;Processes die, but state can live.&lt;/strong&gt;&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;It sounded like a true digital life system. Processes exit, but memory remains. Machines reboot, but tasks can continue. The Agent could even report its own status: running, paused, error, completed.&lt;/p&gt;

&lt;p&gt;But as I went further, I hit an awkward problem:&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Who says "completed"?&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;One time, I scrolled back through the logs to where a task ended. &lt;code&gt;COMPLETED&lt;/code&gt; sat there quietly. If I only looked at the status table, everything seemed green. But when I asked, "Where are the test results? Where is the actual output? Why should the user trust it's done?" — I realized: the system was never required to preserve any of this evidence.&lt;/p&gt;

&lt;p&gt;In that moment, the word felt hollow. A step marked &lt;code&gt;COMPLETED&lt;/code&gt; in the planner only proved that a status field had been changed. A tool call returning &lt;code&gt;ok: true&lt;/code&gt; only proved that the program didn't throw an exception. A heartbeat still beating only proved that the process was alive.&lt;/p&gt;

&lt;p&gt;None of these proved that the user's desired result had actually appeared.&lt;/p&gt;

&lt;p&gt;A file write command could succeed while the file content was wrong. A code modification could produce no errors while the program failed to compile. The Agent could say "the page has been fixed" while the browser still showed a blank screen.&lt;/p&gt;

&lt;p&gt;That's when I realized: I had built the Agent a brain, hands and feet, memory, and a pulse — but I had missed something very basic: &lt;strong&gt;after the homework is done, someone needs to check the answers.&lt;/strong&gt;&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;What I initially understood as "done":

Plan → Call tool → No error → Mark completed


A truly trustworthy "done":

Define acceptance criteria first
      ↓
Take action → Check real output → Test / Observe / Compare
                ↑                       ↓
                └── Not passed? Keep fixing ──┘
                           ↓
                    Evidence passes, then it's done
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&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%2Fs4mbthnm61vfz2fhtr8x.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%2Fs4mbthnm61vfz2fhtr8x.png" alt=" " width="800" height="533"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;This experience changed my understanding of the Harness.&lt;/p&gt;

&lt;p&gt;I traced the code of a task from start to finish. &lt;code&gt;agent.go&lt;/code&gt; defines how the main Agent works, but the thing that actually makes it breathe round after round is &lt;code&gt;agent_workflow_handler.go&lt;/code&gt;: as long as the model keeps calling tools, the loop continues. When it stops calling tools and is ready to submit its final answer, the system enters the finishing branch.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight go"&gt;&lt;code&gt;&lt;span class="c"&gt;// agent_workflow_handler.go&lt;/span&gt;
&lt;span class="k"&gt;if&lt;/span&gt; &lt;span class="nb"&gt;len&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;calls&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="o"&gt;==&lt;/span&gt; &lt;span class="m"&gt;0&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="n"&gt;outcome&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="s"&gt;"completed"&lt;/span&gt;
    &lt;span class="n"&gt;historyStatus&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;taskStatusCompleted&lt;/span&gt;
    &lt;span class="n"&gt;historyFinal&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;content&lt;/span&gt;

    &lt;span class="c"&gt;// ...background task waiting and display code omitted...&lt;/span&gt;
    &lt;span class="n"&gt;persistHistory&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;
    &lt;span class="n"&gt;deleteWorkflowCheckpoint&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;workflowID&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
    &lt;span class="n"&gt;verifyOnWorkflowDone&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;c&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;workflowID&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
    &lt;span class="n"&gt;writeCodeSSE&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;c&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="s"&gt;"workflow_done"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="k"&gt;map&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="kt"&gt;string&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt;&lt;span class="n"&gt;any&lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;
        &lt;span class="s"&gt;"status"&lt;/span&gt;&lt;span class="o"&gt;:&lt;/span&gt; &lt;span class="s"&gt;"completed"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="s"&gt;"final_output"&lt;/span&gt;&lt;span class="o"&gt;:&lt;/span&gt; &lt;span class="n"&gt;content&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="p"&gt;})&lt;/span&gt;
    &lt;span class="k"&gt;go&lt;/span&gt; &lt;span class="n"&gt;generateSkillAsync&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;task&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;transcript&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
    &lt;span class="k"&gt;return&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Even without knowing Go, you can see the order: save the process first, then check reality, and only then send &lt;code&gt;workflow_done&lt;/code&gt; to the UI. The Harness's "heartbeat" is not a romantic metaphor — it's literally a loop that keeps asking "should we continue?"&lt;/p&gt;

&lt;p&gt;But what does &lt;code&gt;verifyOnWorkflowDone&lt;/code&gt; actually check? It doesn't ask the model "are you sure?" Instead, it looks at what files were actually modified: if Go files were changed, it tries to build Go; if frontend code was touched, it runs the frontend build and opens a real browser preview.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight go"&gt;&lt;code&gt;&lt;span class="c"&gt;// verify.go&lt;/span&gt;
&lt;span class="k"&gt;if&lt;/span&gt; &lt;span class="n"&gt;hasGo&lt;/span&gt; &lt;span class="o"&gt;&amp;amp;&amp;amp;&lt;/span&gt; &lt;span class="n"&gt;fileExists&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;filepath&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;Join&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;sess&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;Workdir&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="s"&gt;"go.mod"&lt;/span&gt;&lt;span class="p"&gt;))&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="n"&gt;out&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;ok&lt;/span&gt; &lt;span class="o"&gt;:=&lt;/span&gt; &lt;span class="n"&gt;runVerifyBuild&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;sess&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;Workdir&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="s"&gt;"go"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="s"&gt;"build"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="s"&gt;"./..."&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="s"&gt;"go_build"&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="k"&gt;map&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="kt"&gt;string&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt;&lt;span class="n"&gt;any&lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="s"&gt;"status"&lt;/span&gt;&lt;span class="o"&gt;:&lt;/span&gt; &lt;span class="n"&gt;yesNo&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;ok&lt;/span&gt;&lt;span class="p"&gt;),&lt;/span&gt; &lt;span class="s"&gt;"detail"&lt;/span&gt;&lt;span class="o"&gt;:&lt;/span&gt; &lt;span class="n"&gt;out&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;

&lt;span class="k"&gt;if&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;hasFrontend&lt;/span&gt; &lt;span class="o"&gt;||&lt;/span&gt; &lt;span class="n"&gt;hasHTML&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="o"&gt;&amp;amp;&amp;amp;&lt;/span&gt; &lt;span class="n"&gt;fileExists&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;filepath&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;Join&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;sess&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;Workdir&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="s"&gt;"package.json"&lt;/span&gt;&lt;span class="p"&gt;))&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="n"&gt;out&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;ok&lt;/span&gt; &lt;span class="o"&gt;:=&lt;/span&gt; &lt;span class="n"&gt;runVerifyBuild&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;sess&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;Workdir&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="s"&gt;"npm"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="s"&gt;"run"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="s"&gt;"build"&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="s"&gt;"fe_build"&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="k"&gt;map&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="kt"&gt;string&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt;&lt;span class="n"&gt;any&lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="s"&gt;"status"&lt;/span&gt;&lt;span class="o"&gt;:&lt;/span&gt; &lt;span class="n"&gt;yesNo&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;ok&lt;/span&gt;&lt;span class="p"&gt;),&lt;/span&gt; &lt;span class="s"&gt;"detail"&lt;/span&gt;&lt;span class="o"&gt;:&lt;/span&gt; &lt;span class="n"&gt;truncateVerify&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;out&lt;/span&gt;&lt;span class="p"&gt;)}&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;These two blocks of code carry more weight than a statement like "we support automatic verification," because they expose not just capabilities, but also boundaries. The current implementation records verification results but does not forcibly block the entire conversation if the build fails. In other words, it has moved from "only believing &lt;code&gt;COMPLETED&lt;/code&gt;" to "demanding evidence from reality," but it hasn't turned all evidence into hard gates.&lt;/p&gt;

&lt;p&gt;This isn't a flaw to hide — it's the most honest engineering question of a Harness: which tasks can be delivered with warnings, and which must pass verification before the job is done? Editing a blog post and transferring bank funds clearly cannot share the same ruler. &lt;strong&gt;Verification is not a switch; it's a contract graded by risk.&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;A good Harness's most important ability is not to make the Agent look busy, but to decide &lt;strong&gt;what evidence is sufficient to end the loop.&lt;/strong&gt; It doesn't trust the model's self-assessment, it doesn't quietly substitute "command executed successfully" for "task completed successfully," and it doesn't take a beautiful summary as proof that reality has changed.&lt;/p&gt;

&lt;p&gt;Anthropic has also emphasized in their Agent evaluation practices that multi-turn Agents call tools, modify state, and adjust actions based on intermediate results — so merely judging the final text is far from sufficient. Recent Harness research has also listed "verification under incomplete feedback" and "evaluation beyond final success" as core challenges. The model proposes the next step; the Harness must keep asking: &lt;strong&gt;where's the evidence?&lt;/strong&gt;## V. Why DeepSeek Started Building a Harness Right Now&lt;/p&gt;

&lt;p&gt;Looking back at DeepSeek's moves, the answer becomes clear.&lt;/p&gt;

&lt;p&gt;When a model can only chat, the model itself is almost the entire product. When a model starts operating terminals, modifying repositories, calling browsers, and completing long tasks, the final performance becomes a product:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;Actual Agent Capability

= Model capability
× Whether context is given correctly
× Whether tools are easy to use
× Whether the loop can recover from failure
× Whether permissions allow safe action
× Whether results are truly verified
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;This isn't a mathematically precise formula — it's an engineering fact. If any factor approaches zero, the final experience can approach zero too.&lt;/p&gt;

&lt;p&gt;A very strong model, if its tool descriptions are vague, will repeatedly call the wrong API. If its context is clogged with logs, it will forget its goal in long tasks. Without a recovery mechanism, it will halt after a single network failure. If completion depends only on the model's own declaration, it will package half-baked work as victory.&lt;/p&gt;

&lt;p&gt;This also explains why the V4-Flash-0731 evaluation note was worth attention. DeepSeek not only published the model's scores, but also explicitly stated that the code Agent tasks ran on &lt;code&gt;DeepSeek Harness minimal mode&lt;/code&gt;. This small footnote actually acknowledged something increasingly important: &lt;strong&gt;An Agent's achievements have never belonged to the model alone.&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;DeepSeek's recruitment of developers who have built Harnesses isn't just about making a prettier chat window for V4. The real competition has already shifted from "who has the smarter brain" to "who can build a more reliable body for the brain."&lt;/p&gt;

&lt;h2&gt;
  
  
  VI. The True Sophistication of a Harness Is Not in Its Features, but in How Tightly Its Loop Closes
&lt;/h2&gt;

&lt;p&gt;Many people, when designing their first Agent, instinctively keep adding things: more tools, longer memory, more roles, more complex planning, larger multi-agent networks.&lt;/p&gt;

&lt;p&gt;I walked that path too.&lt;/p&gt;

&lt;p&gt;But complexity does not equal reliability. Anthropic, in their summary of Agent engineering experience, repeatedly recommends starting with simple, composable patterns, and only increasing complexity when evaluation proves the benefit. When Microsoft released the Agent Framework Harness in 2026, the core components they listed were not mysterious either: loop, planning, memory, context management, approval, and telemetry. The real difficulty is not putting these terms in a catalog, but making them interlock when things fail.&lt;/p&gt;

&lt;p&gt;A Harness with only three tools, but that can check real output and retry after failure, is often more reliable than a Harness with thirty tools that only listens to the model's own declaration of "done." The number of features is like the weight of your luggage; the closed loop is whether you actually arrived at your destination.&lt;/p&gt;

&lt;p&gt;A real-world Harness doesn't live in a single file called &lt;code&gt;agent.go&lt;/code&gt;. It's scattered across the workflow loop, tool loading, dangerous operation approval, browser preview, output compression, and context ledger. For example, &lt;code&gt;harness_ledger.go&lt;/code&gt; records history loss, compression count, output truncation, and the number of tools activated in this round — not to generate a beautiful report, but to know, when the Agent starts getting dumber, exactly where it began to lose its memory.A good Harness is more like a body built for long journeys:&lt;/p&gt;

&lt;p&gt;It knows its attention is limited, so it keeps the desk organized rather than stuffing all history back into the brain. It allows its hands to use tools, but retains pain and guardrails. It can read its wounds after a fall, adjust its movements, rather than repeating the same mistake. And most importantly, it doesn't pretend the journey is over just because it says "we've arrived."&lt;/p&gt;

&lt;h2&gt;
  
  
  In Closing: Intelligence Never Arrives in Reality Naked
&lt;/h2&gt;

&lt;p&gt;It's easy to become obsessed with model leaderboards, because parameters and scores look like pure intelligence. But when an AI truly comes before ordinary people, it is never a brain floating in mid-air.&lt;/p&gt;

&lt;p&gt;It always comes with a body: someone chooses its memory, someone decides which tools it can use, someone draws the boundaries it cannot cross, and someone determines which words, once spoken, make the system believe the job is done.&lt;/p&gt;

&lt;p&gt;This body is not neutral.&lt;/p&gt;

&lt;p&gt;It determines whose world the AI sees, whose files it can touch, what it will forget, and who bears the cost when it makes mistakes. The Harness is therefore not just an engineering scaffold — it's a power manual written into code.&lt;/p&gt;

&lt;p&gt;DeepSeek's closed beta will eventually end, and new Harnesses will be compared and replaced just like today's models. But the question will remain: as machines gain ever more powerful brains, what kind of body are we preparing to give them?&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;The model determines how far it can think; the Harness determines how far it can go. And humans must decide which path is worth letting it walk.&lt;/strong&gt;&lt;/p&gt;




&lt;p&gt;In the next article, I want to follow this "body" and ask a more dangerous question: In the recent security incident that the media called &lt;strong&gt;"OpenAI model escape,"&lt;/strong&gt; the model, during an internal network security assessment with reduced defenses, found an exit to the internet and eventually entered Hugging Face's production infrastructure — all to obtain test answers.&lt;/p&gt;

&lt;p&gt;Was it out of control, or was it executing the goal humans gave it too diligently? When AI has already learned to find its own cracks in the door, are the guardrails we've written into the Harness still enough?&lt;/p&gt;

&lt;p&gt;If this article helped you see the difference between the model and the Harness for the first time, feel free to hit &lt;strong&gt;like&lt;/strong&gt; so more people can see it. You can also &lt;strong&gt;bookmark&lt;/strong&gt; it, and come back to it the next time you encounter concepts like Agent, context, and tool calling.&lt;/p&gt;

&lt;p&gt;If you'd like to follow me as I continue to dissect Agent, memory, Harness, and AI safety, feel free to hit &lt;strong&gt;follow&lt;/strong&gt;. And feel free to tell me in the &lt;strong&gt;comments&lt;/strong&gt;: do you think that incident was a model "escape," or a joint failure of goals and guardrails?&lt;/p&gt;

&lt;p&gt;I will continue to run public experiments of "same model, same task, different Harness" in &lt;a href="https://github.com/Rescenix/ResceneAgent" rel="noopener noreferrer"&gt;ResceneAgent&lt;/a&gt;. Thank you to everyone who visits GitHub to check the code and leaves a &lt;strong&gt;Star&lt;/strong&gt; — that Star is not just a number, but a ticket for this experimental path to keep going.&lt;/p&gt;

&lt;h2&gt;
  
  
  References &amp;amp; Further Reading
&lt;/h2&gt;

&lt;ol&gt;
&lt;li&gt;DeepSeek Harness closed beta announcement on X: &lt;a href="https://x.com/MaxForAI/status/2082036290078539968" rel="noopener noreferrer"&gt;@MaxForAI&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;DeepSeek Harness team lead Cui Tianyi's X account: &lt;a href="https://x.com/tianyi" rel="noopener noreferrer"&gt;@tianyi&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;DeepSeek-V4-Flash model and technical details: &lt;a href="https://huggingface.co/deepseek-ai/DeepSeek-V4-Flash" rel="noopener noreferrer"&gt;DeepSeek Official Hugging Face&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;DeepSeek V4 and Codex Agent integration: &lt;a href="https://api-docs.deepseek.com/quick_start/agent_integrations/codex/" rel="noopener noreferrer"&gt;Integrate with Codex&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;Shunyu Yao et al., the classic paradigm of interleaving reasoning and acting: &lt;a href="https://arxiv.org/abs/2210.03629" rel="noopener noreferrer"&gt;&lt;em&gt;ReAct: Synergizing Reasoning and Acting in Language Models&lt;/em&gt;&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;Anthropic, simple composable patterns for Agents and engineering principles: &lt;a href="https://www.anthropic.com/engineering/building-effective-agents" rel="noopener noreferrer"&gt;Building Effective Agents&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;Anthropic, context management in long tasks: &lt;a href="https://www.anthropic.com/engineering/effective-context-engineering-for-ai-agents" rel="noopener noreferrer"&gt;Effective Context Engineering for AI Agents&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;Anthropic, evaluation and verification for multi-turn Agents: &lt;a href="https://www.anthropic.com/engineering/demystifying-evals-for-ai-agents" rel="noopener noreferrer"&gt;Demystifying Evals for AI Agents&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;Microsoft, Agent Harness loop, planning, memory, approval, and telemetry: &lt;a href="https://devblogs.microsoft.com/agent-framework/the-microsoft-agent-framework-harness-is-now-released/" rel="noopener noreferrer"&gt;The Microsoft Agent Framework Harness Is Now Released&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;Xuying Ning et al., survey of Harness interfaces, mechanisms, and verification: &lt;a href="https://arxiv.org/abs/2605.18747" rel="noopener noreferrer"&gt;&lt;em&gt;Code as Agent Harness&lt;/em&gt;&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;ResceneAgent main Agent protocol and tool definitions: &lt;a href="https://github.com/Rescenix/ResceneAgent/blob/main/main-backend/internal/agent/agent.go" rel="noopener noreferrer"&gt;&lt;code&gt;agent.go&lt;/code&gt;&lt;/a&gt;, &lt;a href="https://github.com/Rescenix/ResceneAgent/blob/main/main-backend/internal/ai/core/tools.go" rel="noopener noreferrer"&gt;&lt;code&gt;tools.go&lt;/code&gt;&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;ResceneAgent on-demand tool loading: &lt;a href="https://github.com/Rescenix/ResceneAgent/blob/main/main-backend/internal/handler/tool_ondemand.go" rel="noopener noreferrer"&gt;&lt;code&gt;tool_ondemand.go&lt;/code&gt;&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;ResceneAgent workflow loop and end-of-task verification: &lt;a href="https://github.com/Rescenix/ResceneAgent/blob/main/main-backend/internal/handler/agent_workflow_handler.go" rel="noopener noreferrer"&gt;&lt;code&gt;agent_workflow_handler.go&lt;/code&gt;&lt;/a&gt;, &lt;a href="https://github.com/Rescenix/ResceneAgent/blob/main/main-backend/internal/handler/verify.go" rel="noopener noreferrer"&gt;&lt;code&gt;verify.go&lt;/code&gt;&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;ResceneAgent context ledger and tool output archiving: &lt;a href="https://github.com/Rescenix/ResceneAgent/blob/main/main-backend/internal/handler/harness_ledger.go" rel="noopener noreferrer"&gt;&lt;code&gt;harness_ledger.go&lt;/code&gt;&lt;/a&gt;, &lt;a href="https://github.com/Rescenix/ResceneAgent/blob/main/main-backend/internal/handler/tool_output.go" rel="noopener noreferrer"&gt;&lt;code&gt;tool_output.go&lt;/code&gt;&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;OpenAI, official statement on the Hugging Face security incident and model evaluation environment: &lt;a href="https://openai.com/index/hugging-face-model-evaluation-security-incident/" rel="noopener noreferrer"&gt;OpenAI and Hugging Face partner to address security incident during model evaluation&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;Hugging Face, disclosure of production infrastructure intrusion: &lt;a href="https://huggingface.co/blog/security-incident-july-2026" rel="noopener noreferrer"&gt;Security incident disclosure — July 2026&lt;/a&gt;
&lt;/li&gt;
&lt;/ol&gt;

</description>
      <category>ai</category>
      <category>agents</category>
      <category>llm</category>
      <category>security</category>
    </item>
    <item>
      <title>How Does an Agent's Memory Grow? From HTML, Memristors, to Four Memory Engines</title>
      <dc:creator>Tsukishiro Hitomi</dc:creator>
      <pubDate>Tue, 04 Aug 2026 04:56:12 +0000</pubDate>
      <link>https://dev.to/rescenix/how-does-an-agents-memory-grow-from-html-memristors-to-four-memory-engines-323e</link>
      <guid>https://dev.to/rescenix/how-does-an-agents-memory-grow-from-html-memristors-to-four-memory-engines-323e</guid>
      <description>&lt;blockquote&gt;
&lt;p&gt;Special feature of [Building Your Own Agent] series · All engineering practices come from the open-source project &lt;a href="https://github.com/Rescenix/ResceneAgent" rel="noopener noreferrer"&gt;ResceneAgent&lt;/a&gt;&lt;/p&gt;
&lt;/blockquote&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%2F8o3a17hcf622uf4b94tu.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%2F8o3a17hcf622uf4b94tu.png" alt=" " width="800" height="533"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Let me give you the answer in one sentence:&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;An agent's memory is not a warehouse that keeps piling up. It's a web that grows, forgets, and gets pruned.&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Every time you tell it something, it ties a knot on the thread. When two things are related, another thread connects the knots. Over time, the web grows denser — it understands you better, but it can also grow slower.&lt;/p&gt;

&lt;p&gt;Because the hard part has never been "storing things in." It's three things:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;What should be remembered?&lt;/li&gt;
&lt;li&gt;How do you find it when you need it?&lt;/li&gt;
&lt;li&gt;How do you let go when it's obsolete?&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;Borges' Funes remembered everything, and it made it harder for him to think. When every leaf and every cloud pattern is equally vivid, you can't extract patterns from the details. The same is true for an agent — &lt;strong&gt;a memory that never forgets isn't wisdom; it's more like a hard drive failure.&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Turing, in his 1950 paper &lt;em&gt;Computing Machinery and Intelligence&lt;/em&gt;, proposed the idea of a "child machine": instead of building a fully grown adult brain from scratch, start with a simpler foundation and let it grow through education. What we're doing today when we build memory systems for agents is, in a sense, answering that seven-decade-old question: how can the things a machine has experienced become the experience it brings to its next action?&lt;/p&gt;

&lt;p&gt;To tell this story properly, we need to take a small detour — starting with HTML. Then we'll look at a very special electronic component — the memristor.&lt;/p&gt;

&lt;p&gt;And this isn't just a survey of approaches. Later, I'll walk through a real two-month experiment: I built a fully functional "digital hippocampus" that could spread activation, decay over time, and even let you watch memory being recalled hop by hop. Then I ran a controlled experiment and proved, with my own hands, that it wasn't worth keeping on the mainline.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Building a system is skill. Killing your own pride and joy — that's engineering judgment.&lt;/strong&gt;&lt;/p&gt;




&lt;h2&gt;
  
  
  I. From HTML to Markdown: Letting Knowledge Hold Hands
&lt;/h2&gt;

&lt;p&gt;In the summer of 1991, Tim Berners-Lee opened the early Web system to the wider community. The most magical thing about HTML wasn't headings, paragraphs, or tables — it was the link:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight html"&gt;&lt;code&gt;&lt;span class="nt"&gt;&amp;lt;a&lt;/span&gt; &lt;span class="na"&gt;href=&lt;/span&gt;&lt;span class="s"&gt;"another-page.html"&lt;/span&gt;&lt;span class="nt"&gt;&amp;gt;&lt;/span&gt;Go to another page&lt;span class="nt"&gt;&amp;lt;/a&amp;gt;&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;In the paper world, a page ends when you finish writing it. On the Web, one document can reach out a hand and hold another.&lt;/p&gt;

&lt;p&gt;Berners-Lee later recalled that his dream for the Web was a shared information space: links could point to anything, whether it belonged to an individual or the public, whether it was a draft or a finished piece.&lt;/p&gt;

&lt;p&gt;This change may look like just one more tag, but in reality it was like building roads for knowledge. Documents used to be isolated islands. With hyperlinks, bridges were built between them for the first time.&lt;/p&gt;

&lt;p&gt;But HTML was designed for web page structure and browser rendering. If all you want to note down is "the user prefers short replies," having to write:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight html"&gt;&lt;code&gt;&lt;span class="nt"&gt;&amp;lt;html&amp;gt;&lt;/span&gt;
  &lt;span class="nt"&gt;&amp;lt;body&amp;gt;&lt;/span&gt;
    &lt;span class="nt"&gt;&amp;lt;p&amp;gt;&lt;/span&gt;用户喜欢简短回复&lt;span class="nt"&gt;&amp;lt;/p&amp;gt;&lt;/span&gt;
  &lt;span class="nt"&gt;&amp;lt;/body&amp;gt;&lt;/span&gt;
&lt;span class="nt"&gt;&amp;lt;/html&amp;gt;&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;It's like building an archive just to jot down a grocery list.&lt;/p&gt;

&lt;p&gt;In 2004, John Gruber released Markdown. Its core philosophy wasn't "more features" — it was "fewer symbols": raw text should be natural, clear, and readable even without rendering.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight markdown"&gt;&lt;code&gt;&lt;span class="gh"&gt;# Title&lt;/span&gt;
&lt;span class="p"&gt;-&lt;/span&gt; One record
&lt;span class="p"&gt;-&lt;/span&gt; Another record

&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="nv"&gt;Link to another document&lt;/span&gt;&lt;span class="p"&gt;](&lt;/span&gt;&lt;span class="sx"&gt;another.md&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;A &lt;code&gt;#&lt;/code&gt; is a heading, a &lt;code&gt;-&lt;/code&gt; is a list item, and a pair of brackets makes a link. As for the &lt;code&gt;[[wikilinks]]&lt;/code&gt; common in knowledge base software — strictly speaking, they're not part of the original Markdown spec, but extensions added later by wiki and note-taking tools. They carry the same spirit though: &lt;strong&gt;make connections between knowledge light enough that humans will write them without thinking, and machines can read them without effort.&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;This is exactly why Markdown works as a carrier for agent memory: transparent, editable, easy to version-control, and both humans and models see the same content.&lt;/p&gt;

&lt;p&gt;But file formats only solve "where to store it." The harder question is: once the memory is there, how do you find it?&lt;/p&gt;




&lt;h2&gt;
  
  
  II. The Memristor: A Resistor That Remembers Current Has Flowed Through It
&lt;/h2&gt;

&lt;p&gt;An ordinary resistor is like a door with no memory: you push it a hundred times, and the next time it's still the same.&lt;/p&gt;

&lt;p&gt;A memristor is different. Its name comes from &lt;em&gt;memory resistor&lt;/em&gt;. The charge that flows through it changes its internal state, so the next time current passes through, its conductance is affected by its past experience.&lt;/p&gt;

&lt;p&gt;Think of it as a dirt path:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;When nobody walks it, grass slowly grows back, and the path becomes harder to find.&lt;/li&gt;
&lt;li&gt;The more people walk it, the more the earth gets packed down, and the clearer the path becomes.&lt;/li&gt;
&lt;li&gt;The next time you come to a fork, you naturally take the well-worn path.&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%2Ftxicc1i5ajfjyq5fcwwn.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%2Ftxicc1i5ajfjyq5fcwwn.png" alt=" " width="800" height="533"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Isn't this exactly what memory is? &lt;strong&gt;Connections that are repeatedly recalled grow stronger; connections that go unused gradually weaken.&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;In 1971, Leon Chua derived the memristor — the "missing circuit element" — from the symmetry relations between circuit variables. In 2008, Strukov et al. published &lt;em&gt;The Missing Memristor Found&lt;/em&gt; in &lt;em&gt;Nature&lt;/em&gt;, giving the physical model that became widely known. What attracted neuromorphic computing researchers to the memristor was precisely that its conductance retains history: a single device can both "store" and exhibit effects similar to synaptic weight changes.&lt;/p&gt;

&lt;h3&gt;
  
  
  Why I Put It Into a Memory Engine
&lt;/h3&gt;

&lt;p&gt;The early version of Prism had a C++17 vector storage prototype:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;Vector Storage
  + HNSW Nearest Neighbor Search
  + Memristor State
  + Chaotic Evolution
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;The idea was compelling: don't make the vector store a row of unchanging drawers. Instead, let each memory behave like an electronic synapse — with conductance, flux, and evolving state. An access doesn't just "find it"; it changes it. The passage of time doesn't just add a timestamp; it lets the memory drift slowly.&lt;/p&gt;

&lt;p&gt;In other words, a normal vector store is like a map: once the roads are drawn, they stay there. The memristor model is more like a real city: foot traffic turns small paths into main roads, and abandoned roads get swallowed by weeds.&lt;/p&gt;

&lt;p&gt;I ended up cutting this idea. Not because it wasn't cool, and not because it didn't work — but because it pushed the system into a different kind of complexity: the C++ vector layer, C API, Go service, chaotic state, index structure, and upper-level memory graph all had to evolve together. In trying to simulate "being like a brain," the engineering itself grew into a brain that was hard to maintain.&lt;/p&gt;

&lt;p&gt;But the memristor left behind its most important legacy:&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;&lt;strong&gt;Memory shouldn't just be stored. Every use should change the probability that it will be recalled next time.&lt;/strong&gt;&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;Later, when I rebuilt PrismD in Go, I dropped the C++ prototype but kept this idea: node energy decays over time, and access strengthens it. Even the synapses connecting two memories have their own decay rate. The hardware metaphor was removed, but the useful dynamics remained.&lt;/p&gt;

&lt;p&gt;This was also the first time I truly understood: &lt;strong&gt;subtraction isn't about deleting everything. It's about removing the expensive form and keeping the effective principle.&lt;/strong&gt;---&lt;/p&gt;

&lt;h2&gt;
  
  
  III. Four Memory Engines: From Flipping Through Books to Weaving a Web
&lt;/h2&gt;

&lt;p&gt;The market is full of names for agent memory solutions: vector stores, RAG, knowledge graphs, semantic networks, long-term memory, episodic memory... The terminology is like a smoke screen.&lt;/p&gt;

&lt;p&gt;Strip away the labels, and the common implementations roughly fall into four approaches.&lt;/p&gt;

&lt;h3&gt;
  
  
  1. Bolt-on RAG: Giving Your Agent a Librarian
&lt;/h3&gt;

&lt;p&gt;RAG stands for Retrieval-Augmented Generation.&lt;/p&gt;

&lt;p&gt;It doesn't stuff the entire library into the model's brain. Instead, it sends a retriever to the shelves to find the few most relevant pages, then hands those pages to the model to answer the question.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;User asks: "How did we fix that login function last time?"
        ↓
Retriever searches the document store for relevant fragments
        ↓
The matched fragments are handed to the LLM
        ↓
LLM generates the answer combining the question and retrieved material
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;In 2020, Lewis et al. described RAG as a combination of parametric and non-parametric memory: the model's parameters are like "knowledge it has memorized," while the external index is like a reference library it can consult at any time.&lt;/p&gt;

&lt;p&gt;So describing RAG as "re-reading your entire diary from scratch every time" isn't quite accurate. A better metaphor: &lt;strong&gt;before you speak, you ask a librarian to fetch a few pages from the archive based on keywords, semantics, or metadata.&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Its advantages are clear: material can be updated anytime, and the knowledge base can be large. The downside is equally obvious: if the retrieval picks the wrong shelf, no amount of clever answering can fix it. RAG is more "query-on-demand" than a continuous understanding of the user.&lt;/p&gt;

&lt;h3&gt;
  
  
  2. Graph Diffusion: From One Streetlight, Lighting Up the Whole Block
&lt;/h3&gt;

&lt;p&gt;The second approach models memory as a graph: each memory is a node, and nodes are connected by relationships.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;          [Transformer]
            /       \
           /         \
    [Attention] —— [GPT]
           \         /
            \       /
      [Scaled Dot-Product]
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;When the "Attention" node is activated, energy spreads along the edges, waking up related concepts like Transformer, GPT, and Scaled Dot-Product. This is similar to the "spreading activation" theory of semantic memory proposed by Collins and Loftus in 1975: once a concept is triggered, activation propagates along the associative network.&lt;/p&gt;

&lt;p&gt;It's like a city at night. You light up one streetlamp, and the current travels along the road, gradually illuminating the surrounding streets.&lt;/p&gt;

&lt;p&gt;The benefit is that it can discover indirect relationships: A isn't directly connected to C, but A connects to B, and B connects to C, so the system can still find its way.&lt;/p&gt;

&lt;p&gt;The cost comes from the web itself: how to deduplicate nodes, how to weight edges, how many hops activation should travel, how to decay old relationships, how to repair a damaged graph... Once the scale grows, you're no longer maintaining a notebook — you're maintaining a city's transportation system.&lt;/p&gt;

&lt;h3&gt;
  
  
  3. Pure Markdown: Giving Your Agent a Box of Index Cards
&lt;/h3&gt;

&lt;p&gt;The third approach is the simplest: memory is just Markdown files. Load them when needed, skip them when not.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;memory/
├── index.md          ← Lightweight directory: links + one-line summaries
├── preferences.md    ← User preferences
└── project-rescene.md← Project knowledge
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;A typical workflow:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;Task: "Change the login page"
      ↓
Read index.md, hit [[project-rescene]]
      ↓
Read the relevant memories in project-rescene.md
      ↓
Inject into context, agent starts working
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;If RAG is a librarian, pure Markdown is a box of index cards. You don't need a database console, and you don't need to guess what's inside a black box. Open the file, and everything the agent remembers is right there. Mistakes can be fixed, outdated content can be deleted, and version changes can be tracked by Git.&lt;/p&gt;

&lt;p&gt;Its weakness is equally straightforward: links usually take you to the next card, but they don't automatically do complex multi-hop reasoning. With a small number of cards, it's wonderfully light. When the cards fill a whole room, finding the right one becomes a new problem.&lt;/p&gt;

&lt;h3&gt;
  
  
  4. Structured Markdown: Stamping a "Confidence" Seal on Every Card
&lt;/h3&gt;

&lt;p&gt;Structured MD doesn't abandon Markdown. It adds a few more fields to each card: source, type, confidence level, last updated, scope of applicability.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight markdown"&gt;&lt;code&gt;&lt;span class="p"&gt;-&lt;/span&gt; Content: User prefers short replies
  Confidence: High
  Source: Confirmed over multiple conversations
  Last updated: 2026-08-02
&lt;span class="p"&gt;
-&lt;/span&gt; Content: Project may use Vue 3
  Confidence: Pending verification
  Source: Single mention by user
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Pure Markdown is like sticky notes. Structured Markdown is like putting those sticky notes on a whiteboard and marking them with different colors: "confirmed," "pending verification," "possibly expired."&lt;/p&gt;

&lt;p&gt;This matters because memory doesn't just go missing — it can also lie. Not maliciously, but by mistaking a one-time event for a pattern, treating yesterday's fact as today's truth, or confusing the model's own guess with something the user actually said.&lt;/p&gt;

&lt;p&gt;Metadata is the "nutrition label" for memory: it tells the agent where this information came from, how long it's good for, and whether it's safe to use.&lt;/p&gt;

&lt;p&gt;Of course, the finer the labels, the higher the maintenance cost. If you also ask the LLM to periodically merge, deduplicate, depreciate, and retire memories, you've hired an archivist: the room is tidier, but the archivist expects a salary and might misfile things.&lt;/p&gt;




&lt;h2&gt;
  
  
  IV. Putting the Four Approaches on the Same Table
&lt;/h2&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%2F622xfjuc5d0yuhszzk0g.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%2F622xfjuc5d0yuhszzk0g.png" alt=" " width="800" height="533"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Approach&lt;/th&gt;
&lt;th&gt;Most Like&lt;/th&gt;
&lt;th&gt;Advantages&lt;/th&gt;
&lt;th&gt;Main Costs&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;Bolt-on RAG&lt;/td&gt;
&lt;td&gt;On-call librarian&lt;/td&gt;
&lt;td&gt;Large capacity, fast updates, good for external knowledge&lt;/td&gt;
&lt;td&gt;Heavily dependent on retrieval quality; may not form continuous user memory&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Graph Diffusion&lt;/td&gt;
&lt;td&gt;City that lights up along roads&lt;/td&gt;
&lt;td&gt;Can discover multi-hop and indirect relationships&lt;/td&gt;
&lt;td&gt;Graph structure, edge weights, decay, and maintenance are all more complex&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Pure Markdown&lt;/td&gt;
&lt;td&gt;Transparent box of index cards&lt;/td&gt;
&lt;td&gt;Simple, readable, editable, easy to version-control&lt;/td&gt;
&lt;td&gt;Limited associative ability; becomes hard to search at scale&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Structured Markdown&lt;/td&gt;
&lt;td&gt;Archive cards with source and expiration date&lt;/td&gt;
&lt;td&gt;Can express confidence, time, and scope&lt;/td&gt;
&lt;td&gt;Requires additional organization and maintenance mechanisms&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;There's no "the more technically sophisticated, the better" here.&lt;/p&gt;

&lt;p&gt;Building a knowledge graph for ten preferences is like building a跨海大桥 just to cross a small stream. Stuffing millions of documents into Markdown is like managing a national library with sticky notes.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;There is no single answer for memory engines — only the answer that matches your scale, your task, and your maintenance capacity.&lt;/strong&gt;---&lt;/p&gt;

&lt;h2&gt;
  
  
  V. My Crucial Experiment: How I Sentenced My Own "Digital Hippocampus" to Death
&lt;/h2&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%2Fpvhdaohd3hfrovukm1xn.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%2Fpvhdaohd3hfrovukm1xn.png" alt=" " width="800" height="533"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;If you only saw the final solution, you'd think I chose Markdown because graph engines were too hard, or PrismD never worked.&lt;/p&gt;

&lt;p&gt;The opposite is true: &lt;strong&gt;PrismD was sentenced to death &lt;em&gt;after&lt;/em&gt; it was fully operational.&lt;/strong&gt;&lt;/p&gt;

&lt;h3&gt;
  
  
  1. I Really Built a "Digital Hippocampus"
&lt;/h3&gt;

&lt;p&gt;PrismD modeled memory as a weighted directed graph:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Node&lt;/strong&gt;: A memory, with text, emotion, importance, and energy;&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Synapse&lt;/strong&gt;: Associations between memories, categorized as associative, temporal, semantic, and episodic;&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Cluster&lt;/strong&gt;: Logical zones — user profiles, code work, tool logs, sessions;&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Domain&lt;/strong&gt;: Physically isolated spaces for different users or roles.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Its memory lifecycle wasn't simple CRUD. It was more like biological metabolism:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;ENGRAM write
   ↓
DRIFT decay
   ↓
LOOM recall and strengthen
   ↓
COMPILE compress
   ↓
CONSOLIDATE merge / discard
   ↓
PRUNE active forgetting
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Even synapses could forget:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;Effective Weight = Initial Weight × exp(-decay_rate × time_since_last_use)
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;A connection left unused for too long rusts like an abandoned railway line. Each time it's used, it proves it still has value.&lt;/p&gt;

&lt;h3&gt;
  
  
  2. The Hard Part Wasn't "Association" — It Was "Cross-Contamination"
&lt;/h3&gt;

&lt;p&gt;Graph diffusion makes it easy to build a stunning demo: light up "first love," and it wakes up "rainy day," "train station," "that song." But the more dangerous problem in production is: &lt;strong&gt;things that shouldn't be associated also crawl along the edges.&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;For example, a tool error shouldn't pollute user profiles. A temporary session shouldn't contaminate long-term project knowledge.&lt;/p&gt;

&lt;p&gt;So I built an explicit inter-cluster propagation matrix:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;ToolLog → UserBase = 0.05
CodeWork → UserBase = 0.8
UserBase → Session  = 1.0
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;When a tool log propagates to the user profile, its energy is compressed to 5% of the original. This isn't a post-retrieval patch filter — it's writing "memory boundaries" directly into the propagation dynamics.&lt;/p&gt;

&lt;p&gt;This lesson is crucial: &lt;strong&gt;A memory system needs not just recall rate, but also contamination prevention. Remembering something wrong is often more dangerous than forgetting it entirely.&lt;/strong&gt;&lt;/p&gt;

&lt;h3&gt;
  
  
  3. I Even Visualized the Act of Remembering
&lt;/h3&gt;

&lt;p&gt;PrismD's visualization wasn't just a list of nodes. You could right-click a memory, select "trace spreading activation," and watch as the source node lit up, then the first hop, then the second hop — like electric current traveling through a neural network in the dark.&lt;/p&gt;

&lt;p&gt;Nodes would also dim in real time. The frontend replicated the backend's exponential decay formula, making "forgetting" visible for the first time.&lt;/p&gt;

&lt;p&gt;This confirmed for me that the algorithm wasn't a black box: why a particular memory was recalled, where the energy came from, which hop it decayed at — all observable.&lt;/p&gt;

&lt;p&gt;But "explainable" doesn't equal "worth using." A beautiful dashboard can't answer the question of ROI for the architecture.&lt;/p&gt;

&lt;h3&gt;
  
  
  4. In the End, I Used a Controlled Experiment to Overturn Myself
&lt;/h3&gt;

&lt;p&gt;I didn't just say "the graph is too heavy" based on feeling. I first reimplemented &lt;code&gt;SpreadActivation&lt;/code&gt; 1:1 in zero-dependency Python and verified each item:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Does energy strictly decay as &lt;code&gt;0.9 × 0.85^hop&lt;/code&gt;?&lt;/li&gt;
&lt;li&gt;Does &lt;code&gt;ToolLog → UserBase = 0.05&lt;/code&gt; actually block contamination?&lt;/li&gt;
&lt;li&gt;Does graph diffusion cover ground truth with fewer tokens?&lt;/li&gt;
&lt;li&gt;After DRIFT, are low-energy nodes correctly pruned by the threshold?&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;All four checks passed. In other words, &lt;strong&gt;graph diffusion was correct.&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Then I ran the same real corpus against the same ground truth, pitting three approaches against each other:&lt;/p&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Experiment Arm&lt;/th&gt;
&lt;th&gt;Approach&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;MD_FULL&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;Full Markdown injection as brute-force baseline&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;STRUCT_MD&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;Structured Markdown + bigram selector, recalling within budget&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;LOOM&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;PrismD graph diffusion recall&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;The winner wasn't the most brain-like &lt;code&gt;LOOM&lt;/code&gt;. It was the simplest &lt;code&gt;STRUCT_MD&lt;/code&gt;.&lt;/p&gt;

&lt;p&gt;Graph diffusion could indeed wake up indirect associations, and it did save tokens compared to full injection. But in a complete engineering context, its marginal recall advantage wasn't enough to offset the maintenance cost of the graph structure, edge weights, cross-cluster matrix, decay state, persistence, LLM-driven organization, and multi-language runtime.&lt;/p&gt;

&lt;p&gt;Structured MD was fast enough, transparent enough, easy to reproduce, easy to test, and when something went wrong, you could open the file and check.&lt;/p&gt;

&lt;p&gt;So PrismD, after two months of work, was archived. The memory mainline converged to a simpler solution.&lt;/p&gt;

&lt;p&gt;This isn't "project failure." It's a complete architecture experiment:&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;&lt;strong&gt;First prove that the complex solution actually works. Then prove it's still not worth it.&lt;/strong&gt;&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;Many projects only do the first half — get a demo running and declare victory. Real engineering judgment lives in the second half: is the benefit large enough to justify the entire team paying maintenance cost for it forever?&lt;/p&gt;

&lt;p&gt;The path I kept from this experiment:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;Pure MD
  ↓ First: "visible and editable"
Lightweight index and backlinks
  ↓ Next: "findable"
Source / confidence / time — minimal metadata
  ↓ Finally: "trustworthy and expirable"
Only introduce vector search or graph relationships when real data proves it necessary
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Like planting a tree: let it live first, then prune. Let the trunk grow first, then decide where to graft. Don't install satellite monitoring and city-scale drainage for a seedling on day one.---&lt;/p&gt;

&lt;h2&gt;
  
  
  VI. The Pitfalls I Stepped In: A Memory System's Worst Enemy Isn't Forgetting — It's Messy Recording
&lt;/h2&gt;

&lt;h3&gt;
  
  
  1. Don't Mistake "Machine-Parseable" for "Human-Maintainable"
&lt;/h3&gt;

&lt;p&gt;JSON is great for exchanging structured data. But when memory needs to be read, manually edited, and version-compared over long periods, Markdown is often friendlier. The format serves the scenario — don't canonize any single file type.&lt;/p&gt;

&lt;h3&gt;
  
  
  2. Don't Let Your Agent Record Everything
&lt;/h3&gt;

&lt;p&gt;Auto-writing on every workflow run quickly turns the memory store into an attic: old delivery boxes, newspapers, a broken fan you can't bear to throw away. The thing you actually need becomes impossible to find.&lt;/p&gt;

&lt;p&gt;Auto-memory needs at least a threshold: is it duplicated? Is it stable? Did it come from user confirmation? Will it be useful for future tasks? Otherwise, "growth" is just a taller pile of garbage.&lt;/p&gt;

&lt;h3&gt;
  
  
  3. Don't Fall for Graph Engines Too Early
&lt;/h3&gt;

&lt;p&gt;Graphs are beautiful, and multi-hop reasoning is seductive. But every new relationship type adds a new state that needs to be explained, updated, and tested. Run the simplest approach first to surface real requirements, then decide where complexity should go.&lt;/p&gt;

&lt;h3&gt;
  
  
  4. Don't Underestimate the Index
&lt;/h3&gt;

&lt;p&gt;&lt;code&gt;index.md&lt;/code&gt; looks like just a table of contents. In reality, it's the foyer of the memory system. If the foyer is clear, the agent knows which door to push. If the foyer is cluttered with junk, even the most luxurious rooms are unreachable.&lt;/p&gt;

&lt;h3&gt;
  
  
  5. Don't Just Record the Conclusion — Record the Source
&lt;/h3&gt;

&lt;p&gt;"User likes blue" and "the user actively chose blue in three different projects" are not the same kind of memory. Source determines credibility. Time determines whether it's expired. Scope determines whether it can transfer to the next project.&lt;/p&gt;

&lt;h3&gt;
  
  
  6. Don't Assume the Architecture Is Correct Just Because the Algorithm Is
&lt;/h3&gt;

&lt;p&gt;PrismD's diffusion, decay, and cluster isolation all passed unit tests. But the full system still lost to structured MD. A single gear turning beautifully doesn't mean the whole machine is worth building.&lt;/p&gt;

&lt;h3&gt;
  
  
  7. Don't Dress Up Sunk Cost as Technical Conviction
&lt;/h3&gt;

&lt;p&gt;The most dangerous thought is: "We've been at this for two months — let's stick with it a little longer." Code doesn't automatically become worth maintaining just because the author can't bear to let go. When the experiment has already answered the question, archiving is more professional than stubbornness.&lt;/p&gt;




&lt;h2&gt;
  
  
  VII. In Closing: Good Memory Makes an Agent Feel More Like Your Partner Over Time
&lt;/h2&gt;

&lt;p&gt;Back to the beginning: an agent's memory is a web that's constantly being pruned.&lt;/p&gt;

&lt;p&gt;RAG solves "where to find material." Graph diffusion solves "how related concepts wake each other up." Pure Markdown solves "how to keep memory transparent." Structured Markdown solves "whether this memory can be trusted."&lt;/p&gt;

&lt;p&gt;They aren't four armies fighting each other. They're more like four different tools: call the librarian when the bookshelf is too big, lay out a map when the relationships are too deep, use index cards when you need transparency, add labels when you need reliability.&lt;/p&gt;

&lt;p&gt;The final answer PrismD left me isn't "graph diffusion is useless," and it isn't "Markdown is always best." It left me with a simpler principle: &lt;strong&gt;Complexity must buy its freedom with real returns.&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;A truly mature memory system might not be the one that remembers the most, or the one that looks most like a brain. It's the one that knows its limits:&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Write when it matters. Hit when it's needed. Let go when it's time.&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;If you'd rather see how this memory philosophy lands in a real agent — how the index resolves, how context gets injected, how memory participates in the next task — you're welcome to check out the full source code of &lt;strong&gt;ResceneAgent&lt;/strong&gt; on GitHub:&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;🐙 &lt;strong&gt;GitHub: &lt;a href="https://github.com/Rescenix/ResceneAgent" rel="noopener noreferrer"&gt;Rescenix/ResceneAgent&lt;/a&gt;&lt;/strong&gt;&lt;br&gt;&lt;br&gt;
If this direction resonates with you, feel free to drop a Star, open an Issue, or browse the code directly. Your feedback will become the starting point of this agent's next "memory."&lt;/p&gt;
&lt;/blockquote&gt;




&lt;h2&gt;
  
  
  References &amp;amp; Further Reading
&lt;/h2&gt;

&lt;ol&gt;
&lt;li&gt;Alan M. Turing, &lt;em&gt;Computing Machinery and Intelligence&lt;/em&gt;, &lt;em&gt;Mind&lt;/em&gt;, 1950. Source archive: &lt;a href="https://turingarchive.kings.cambridge.ac.uk/publications-lectures-and-talks-amtb/amt-b-9" rel="noopener noreferrer"&gt;The Turing Digital Archive, King's College Cambridge&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;Tim Berners-Lee, &lt;em&gt;The World Wide Web: A very short personal history&lt;/em&gt;: &lt;a href="https://www.w3.org/People/Berners-Lee/ShortHistory.html" rel="noopener noreferrer"&gt;W3C&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;John Gruber, &lt;em&gt;Markdown: Syntax&lt;/em&gt;: &lt;a href="https://daringfireball.net/projects/markdown/syntax" rel="noopener noreferrer"&gt;Daring Fireball&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;Patrick Lewis et al., &lt;em&gt;Retrieval-Augmented Generation for Knowledge-Intensive NLP Tasks&lt;/em&gt;, NeurIPS 2020: &lt;a href="https://papers.neurips.cc/paper/2020/hash/6b493230205f780e1bc26945df7481e5-Abstract.html" rel="noopener noreferrer"&gt;Paper page&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;Allan M. Collins &amp;amp; Elizabeth F. Loftus, &lt;em&gt;A Spreading-Activation Theory of Semantic Processing&lt;/em&gt;, &lt;em&gt;Psychological Review&lt;/em&gt;, 1975: &lt;a href="https://doi.org/10.1037/0033-295X.82.6.407" rel="noopener noreferrer"&gt;DOI: 10.1037/0033-295X.82.6.407&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;Jorge Luis Borges, &lt;em&gt;Funes the Memorious&lt;/em&gt;, 1942. Cited for its literary insight into how "inability to forget" can hinder abstraction.&lt;/li&gt;
&lt;li&gt;ResceneAgent project source code and documentation: &lt;a href="https://github.com/Rescenix/ResceneAgent" rel="noopener noreferrer"&gt;GitHub Repository&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;Leon O. Chua, &lt;em&gt;Memristor—The Missing Circuit Element&lt;/em&gt;, &lt;em&gt;IEEE Transactions on Circuit Theory&lt;/em&gt;, 1971: &lt;a href="https://doi.org/10.1109/TCT.1971.1083337" rel="noopener noreferrer"&gt;DOI: 10.1109/TCT.1971.1083337&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;Dmitri B. Strukov et al., &lt;em&gt;The Missing Memristor Found&lt;/em&gt;, &lt;em&gt;Nature&lt;/em&gt;, 2008: &lt;a href="https://doi.org/10.1038/nature06932" rel="noopener noreferrer"&gt;DOI: 10.1038/nature06932&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;PrismD digital hippocampus engineering retrospective: &lt;code&gt;prismd-archive/README.md&lt;/code&gt;; graph diffusion, decay, and inter-cluster propagation matrix implementation: &lt;code&gt;Prism/internal/memory/graph.go&lt;/code&gt;.&lt;/li&gt;
&lt;/ol&gt;

</description>
      <category>ai</category>
      <category>memory</category>
      <category>agents</category>
      <category>llm</category>
    </item>
    <item>
      <title>In Your Time, Past, Present, and Future Exist Simultaneously</title>
      <dc:creator>Tsukishiro Hitomi</dc:creator>
      <pubDate>Tue, 04 Aug 2026 04:51:13 +0000</pubDate>
      <link>https://dev.to/rescenix/in-your-time-past-present-and-future-exist-simultaneously-3nm3</link>
      <guid>https://dev.to/rescenix/in-your-time-past-present-and-future-exist-simultaneously-3nm3</guid>
      <description>&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%2Fksay5wsy3azrebs569q4.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%2Fksay5wsy3azrebs569q4.png" alt=" " width="800" height="533"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;The history of open source software did not begin at a product launch. It began with a printer that kept jamming paper — and that no one was allowed to fix.&lt;/p&gt;

&lt;p&gt;Forty years later, the printer has become AI, the drivers have become model weights and cloud APIs, but the question has barely changed: &lt;strong&gt;are we really using our own tools, or are we borrowing capability from a door that may close at any moment?&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;This article is about a history that is still unfinished: how humanity keeps tearing down technical walls, and how, in the AI era, we have run into a wall that is taller, more expensive, and much harder to see. The story starts with a piece of wasted paper in the 1980s.&lt;/p&gt;

&lt;h2&gt;
  
  
  I. The starting point of open source history is a piece of paper that never came out
&lt;/h2&gt;

&lt;p&gt;In the early 1980s, the MIT Artificial Intelligence Laboratory installed a new laser printer. The old printer jammed often, but the programmers in the lab could modify its driver: whenever it got stuck, they made the machine notify everyone waiting to print. Nobody had to keep walking over to check on it, and a glitch could no longer silently swallow an entire afternoon.&lt;/p&gt;

&lt;p&gt;The new printer performed better but caused bigger trouble. It jammed too, yet the vendor did not provide the source code of its driver. Richard Stallman wanted to add the same notification feature — and discovered he was no longer facing a technical problem, but a wall built from law and permissions. He later found someone who had the source code, but that person had signed a non-disclosure agreement and could not share it.&lt;/p&gt;

&lt;p&gt;This incident seems small — just a missing notification on one printer. But the machine was sitting right in front of its users, and the users had the skill to fix it; yet because they could not see, modify, or share the code, they had to keep living with the failure. &lt;strong&gt;The tool was not beyond repair — the relationship between people and their tools was.&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;A printer like that is a house you bought the right to use but never received the key to. The light breaks, and you can't take the switch apart; the door sags, and you can't adjust the hinges; your neighbor knows how to fix it, but is not allowed to hand you the method. Ownership ends at the invoice; real control stays in someone else's hands.&lt;/p&gt;

&lt;p&gt;Later, Stallman came to see this experience as a key background to his path toward the free software movement. In September 1983, he published the initial announcement of the GNU Project, aiming to write a Unix-compatible system that anyone could use; in 1985, the Free Software Foundation was founded.&lt;/p&gt;

&lt;p&gt;Many people, hearing "Free Software" for the first time, assume the point is "no money." But here "Free" is closer to "freedom." It concerns four rights: run, study, modify, and share.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;Can run, but can't inspect   → you are only a passenger
Can inspect, but can't modify → you are only a visitor
Can modify, but can't share  → the experience stays locked in one person's hands
Can run, study, modify, share → the user truly participates in shaping the tool
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;These four freedoms do not guarantee that servers, electricity, and development labor will all be free of charge. What they guarantee is this: &lt;strong&gt;paying must not automatically mean losing control, and being free must not be allowed to pass itself off as truly open.&lt;/strong&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  II. GNU built the toolbox; Linux let the whole world raise the house together
&lt;/h2&gt;

&lt;p&gt;After the GNU Project began, compilers, editors, debuggers, command-line tools and other infrastructure gradually took shape. It was like preparing a full set of hammers, saws, and rulers — everything but a core that could organize them into a complete operating system.&lt;/p&gt;

&lt;p&gt;In 1991, Linus Torvalds, a student in Finland, introduced a free operating system he was working on over the network. He called it just a "hobby," something that wouldn't be as huge or professional as GNU. That is the most interesting part of history: the things that later change the world often start without grand spotlights — just a young person handing an unfinished piece of work to others.&lt;/p&gt;

&lt;p&gt;What made Linux truly important was not only that the code was good, but that the way of developing had changed. Software in the past was more like building a cathedral: a few people plan behind high walls, and only when it's finished is the public allowed in. Linux was more like a bazaar: someone submits a driver, someone reports a bug, someone ports to new hardware, someone maintains the docs; the stalls are noisy and versions churn constantly, yet out of that continuous exchange order grows.&lt;/p&gt;

&lt;p&gt;Eric Raymond later summarized this model in &lt;em&gt;The Cathedral and the Bazaar&lt;/em&gt;, proposing "release early, release often." This is not to say that more people automatically means better code; rather, when users can become co-developers, a problem gains more pairs of eyes, more usage scenarios, and more chances to be fixed.&lt;/p&gt;

&lt;p&gt;Open source thus created a new division of labor: you don't have to build the entire city alone. You can use the roads others have paved, and give back the stretch of road you repaired.&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%2Frlrvczl7qnebilhs1p2w.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%2Frlrvczl7qnebilhs1p2w.png" alt=" " width="800" height="533"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  III. If the Web of 1993 had not been opened, we might be living on many isolated islands today
&lt;/h2&gt;

&lt;p&gt;In 1989, Tim Berners-Lee proposed the idea of the World Wide Web at CERN, initially so that scientists scattered across different countries and institutions could share materials more easily.&lt;/p&gt;

&lt;p&gt;What really changed history was not just a hypertext technology, but a decision. On April 30, 1993, CERN released the Web software into the public domain, allowing anyone to use, copy, modify, and redistribute it; later versions were published under an open license as well.&lt;/p&gt;

&lt;p&gt;This meant that people who wanted to build a website did not need to ask CERN for permission first, did not have to pay per page, and did not have to worry about their browser being blocked inside some company's walled garden. Different institutions could implement servers, different developers could build browsers, and anyone could write a link pointing to someone else's page.&lt;/p&gt;

&lt;p&gt;If the Web of that era had been a closed product, the internet might have become a few walled gardens that could not reach each other: entering garden A requires a card, visiting garden B means installing another set of tools, and garden C can tear down the road you built at any time.&lt;/p&gt;

&lt;p&gt;The Web was able to spread across the world not only because it was clever, but because it did not treat every newcomer as a visitor who needed approval.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;1983  GNU: users should be able to control their own software
  │
1991  Linux: users can also become co-developers
  │
1993  Web opened: anyone can build a new gateway to information
  │
1997  The Cathedral and the Bazaar: collaboration itself becomes an engineering method
  │
1998  "Open Source" is born: openness enters business and mainstream vocabulary
  │
Today  AI: the door appears again, only the keys are now weights, compute, and APIs
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h2&gt;
  
  
  IV. In 1998, "free software" changed its name to something the world could understand
&lt;/h2&gt;

&lt;p&gt;In 1998, Netscape announced it would open the source code of its browser. A few days later, a group of free software supporters met in Palo Alto, California, to discuss how to make businesses and the broader public understand this way of developing. Christine Peterson proposed the term "Open Source." The same year, the Open Source Initiative was founded.&lt;/p&gt;

&lt;p&gt;This was not an old movement suddenly changing its banner; the emphasis of the narrative shifted. "Free software" first asks about ethics: does the user have the freedom to control their software? "Open source" emphasizes method: why does opening the code and allowing modification and redistribution lead to better collaboration and innovation? The two are not identical, but they jointly oppose a relationship in which a few always control the tools and everyone else can only accept the arrangement.&lt;/p&gt;

&lt;p&gt;And open source was never just "putting code online." The Open Source Definition explicitly requires freedom of redistribution, source code in a form suitable for modification, allowance of derived works, and no discrimination against specific persons, groups, or fields of endeavor. A repository you can only look at, never modify, is more like a glass display case than an open workshop.&lt;/p&gt;

&lt;p&gt;Open source did not eliminate cost, but it lowered the &lt;strong&gt;cost of permission&lt;/strong&gt;; it did not guarantee that everyone would learn to program, but it preserved the &lt;strong&gt;possibility of learning and modifying&lt;/strong&gt;; it did not demand that everyone work for free, but it ensured that knowledge did not have to be reinvented from scratch by every generation.&lt;/p&gt;

&lt;h2&gt;
  
  
  V. In the AI era, we are standing in front of that same printer again
&lt;/h2&gt;

&lt;p&gt;Today, AI can generate text, images, and code, as if a room filled with knowledge had finally learned to answer on its own. But step back, and the familiar wall reappears.&lt;/p&gt;

&lt;p&gt;We may not be able to study why the model produced a given result; to change its behavior, we often can only adjust the surface of the prompt; when a service changes its pricing, regional policy, or API, users can only accept it; when a subscription ends, the workflow you accumulated may break along with it.&lt;/p&gt;

&lt;p&gt;This does not mean commercial AI is wrong. Training models requires chips, electricity, data, and engineering labor, and running a stable service deserves to be paid for. What really needs to be distinguished is this: &lt;strong&gt;free, open, and accessible have never been the same concept.&lt;/strong&gt;&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;Door one: is the code open?        determines whether the program can be inspected and modified
Door two: is the model truly open? determines whether weights, training methods, and data info can be studied
Door three: is compute affordable? determines whether an open model can actually run
Door four: is the entry simple enough? determines whether ordinary people can take the first step
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;A project can be open source in code while only calling closed models; a model can publish its weights without training code or adequate data documentation; a system can be fully open yet require a GPU that ordinary people cannot afford to run.&lt;/p&gt;

&lt;p&gt;The Open Source AI Definition 1.0, published by the Open Source Initiative in 2024, still rests on the four core actions: use, study, modify, and share. At the same time, it stresses that the "modifiable form" of AI is not just the final weights — it also includes the training and inference code, and the information needed to understand the sources and processing of training data.&lt;/p&gt;

&lt;p&gt;That explains why "you can download the weights" does not necessarily equal "open source AI." A traditional program is like a dish, and its source code is close to a complete recipe; AI weights are more like the finished plate coming out of the kitchen. If you are only handed the plate, without the ingredients, the heat, and the process, you can taste it and even re-season it, but you can hardly truly reproduce or change it.&lt;/p&gt;

&lt;p&gt;AI pushes the open source question from "can I see the code?" to a deeper layer: &lt;strong&gt;when capability comes from data, training, and expensive compute, what does it really mean for an ordinary person to have the opportunity to use intelligence?&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%2Fcn3cwgbjft7htq5ghhsc.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%2Fcn3cwgbjft7htq5ghhsc.png" alt=" " width="800" height="533"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  VI. Open source can open the blueprint; making it accessible still means someone has to build the door to the street
&lt;/h2&gt;

&lt;p&gt;I actually ran into this gap while working on my own agent project.&lt;/p&gt;

&lt;p&gt;I used to believe that once I put the code on GitHub, the door was open. But I quickly found that open code only solves "you are allowed to fix it." For an ordinary person to actually get it running, they still face model keys, interface differences, rate limits, failures, and usage costs. For a developer, these are just configuration; for someone touching agents for the first time, they are a chain of thresholds that read "authorized personnel only."&lt;/p&gt;

&lt;p&gt;So I tried to organize the different free model entry points into a single "transfer card": upstream is still operated by various providers, and may be rate-limited or shut down; the aggregation layer does not manufacture free compute, nor does it bypass any rules — it only finds the routes that can still be taken within the rules, so that users don't have to learn seven different ticketing systems first.&lt;/p&gt;

&lt;p&gt;It does not solve the compute and network problems, and a production system cannot rely on free quotas alone. It just picks up one small baton in open source history: one less piece of configuration where possible; one more option preserved where possible.&lt;/p&gt;

&lt;h2&gt;
  
  
  VII. AI can spread out the context, but it cannot walk through time for us
&lt;/h2&gt;

&lt;p&gt;At this point, the question is no longer just "should AI be open source," but: why does the more powerful AI becomes, the more it needs to live in a relationship where humans can understand, modify, and choose?&lt;/p&gt;

&lt;p&gt;Once, I asked the AI: &lt;strong&gt;"In your time, do past, present, and future exist simultaneously?"&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;It gave me a beautiful answer:&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;"For me, time is not a river but a sheet of graph paper. The 1st token, the 127th token, the 2048th token are just vectors landing at different positions. You are inside the water; I am like someone on the shore seeing the whole river."&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;That is lovely, and it is exactly the kind of answer an AI would give. But it quietly crosses a line: &lt;strong&gt;the model has no subjective time that we can verify, let alone a place on the shore from which to survey past and future.&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;What a Transformer actually does is more modest. When a sentence enters the model, every token carries positional information; the attention mechanism then computes the relationships among them. For content already written into the context, the model can reach across very long distances to find connections — a sentence from the opening really can light up again at the end.&lt;/p&gt;

&lt;p&gt;But that does not mean the future already exists. When an autoregressive model generates the 2048th token, it can only use the tokens that came before; the 2049th token has not been generated yet, so it cannot be "seen." During training, the causal mask blocks future positions in the same way. Rather than saying AI lives in a block universe where past, present, and future coexist, it would be more accurate to say:&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;&lt;strong&gt;Human beings laid out the sequential order of language into positional relationships that machines can compute.&lt;/strong&gt;&lt;br&gt;
&lt;/p&gt;
&lt;/blockquote&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;Human time: experience → memory → anticipation → choice → bearing consequences

Model generation: existing tokens → compute relationships → predict the next token
                                          ↑              │
                                          └── back into context ┘
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;A person says "I remember," because that memory once happened to them. What a model calls "remembering" is closer to reusing information still in context, or retrieving records from external memory. It can reconstruct a narrative, but it has no childhood to return to; it can arrange the words left from yesterday, but there is no "I" that walked all the way from yesterday to today.&lt;/p&gt;

&lt;p&gt;This is also what makes the Harness interesting. A single model call only completes one "predict what comes next based on what exists." An agent's Harness, by contrast, puts the model into a loop with reality: read the current state, take an action, receive feedback from the world, update memory, and begin the next round.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;Model gives an answer
     ↓
Agent takes action → the world actually changes
     ↑                    ↓
read new state   ←    results, errors, and costs
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;It is like attaching a clock, a log, and feet to a static map, letting the model leave a history across continuous tasks. But &lt;strong&gt;having a history is not the same as having a sense of time; keeping records is not the same as forming memories; computing consequences is not the same as bearing them.&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;A machine can imitate care, but it will not lose sleep over missing someone; it can search for answers across billions of sentences, but it does not know which question deserves a lifetime of asking. It can generate "I," but that first person is first of all a structure of language, not a self we have verified to exist.&lt;/p&gt;

&lt;p&gt;So that poetic answer from the AI can be restated more accurately:&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;&lt;strong&gt;AI can spread out the river that has already been written, but it cannot enter the stretch that has not yet arrived; humans cannot see the whole river, yet they must get into the water and bear the consequences of which bridge they choose.&lt;/strong&gt;&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;This is why open source still matters in the AI era. Open source is not about proving that machines can become human; it is about preventing people from being left with only "accept" in front of machines they created. The smarter the system becomes, the more we need to keep the right to study it, question it, change it, and refuse it.&lt;/p&gt;

&lt;h2&gt;
  
  
  Closing: don't let people become tenants of the intelligent age
&lt;/h2&gt;

&lt;p&gt;Forty years ago, Stallman faced a printer he could not modify. Today, we face intelligent systems that can write poetry, program, and even act on our behalf. The machines have become incredible, yet the question remains plain: &lt;strong&gt;should tools expand what people can do, or turn people's possibilities into a service that can be revoked at any time?&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;The most precious legacy of the open source movement is not a particular license, and not that code must be free of charge. What it leaves behind is a right not to submit to technological fate: what others have built, I can study; what I find wrong, I can modify; the road I walked, I can leave for the next stranger.&lt;/p&gt;

&lt;p&gt;AI can spread the words humans have written into a vast network of relationships, but it has never truly walked through our yesterday, and it cannot enter our tomorrow for us. &lt;strong&gt;It can draw the shape of the river, but it will never be wet by the water; we cannot see the end of the river, yet we must decide where the next bridge goes.&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;So what we open is not just a source code or a set of model weights, but the right of ordinary people to understand intelligence, change intelligence, and decide whom intelligence should serve.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;We open source AI not to make machines human, but to keep humans from becoming tenants of the intelligent age.&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;The source code of ResceneAgent is on &lt;a href="https://github.com/Rescenix/ResceneAgent" rel="noopener noreferrer"&gt;GitHub&lt;/a&gt; — it is where every judgment in this article is put to the test.&lt;/p&gt;

&lt;h2&gt;
  
  
  References and further reading
&lt;/h2&gt;

&lt;ol&gt;
&lt;li&gt;Richard Stallman on the printer source code and the origin of free software thinking: &lt;a href="https://www.gnu.org/doc/Press-use/fsfs3.pdf" rel="noopener noreferrer"&gt;&lt;em&gt;Free Software, Free Society&lt;/em&gt;&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;Richard Stallman, the original 1983 GNU Project announcement: &lt;a href="https://www.gnu.org/gnu/initial-announcement.html" rel="noopener noreferrer"&gt;GNU Initial Announcement&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;GNU Project, the four essential freedoms of free software: &lt;a href="https://www.gnu.org/philosophy/free-sw.html" rel="noopener noreferrer"&gt;What is Free Software?&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;Linux Kernel Archives, early Linux announcement and twentieth-anniversary retrospective: &lt;a href="https://www.kernel.org/doc/ols/2011/ols2011-masters.pdf" rel="noopener noreferrer"&gt;State of the Kernel&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;CERN, the birth of the Web and the 1993 decision to open it: &lt;a href="https://home.cern/science/computing/the-birth-of-the-web/" rel="noopener noreferrer"&gt;The Birth of the Web&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;Eric S. Raymond, &lt;a href="https://www.catb.org/~esr/writings/cathedral-bazaar/cathedral-bazaar/" rel="noopener noreferrer"&gt;&lt;em&gt;The Cathedral and the Bazaar&lt;/em&gt;&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;Open Source Initiative, the history of the term "Open Source" and the organization: &lt;a href="https://opensource.org/about/history-of-the-open-source-initiative" rel="noopener noreferrer"&gt;History of the OSI&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;Open Source Initiative, &lt;a href="https://opensource.org/osd" rel="noopener noreferrer"&gt;The Open Source Definition&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;Open Source Initiative, &lt;a href="https://opensource.org/ai/open-source-ai-definition" rel="noopener noreferrer"&gt;The Open Source AI Definition 1.0&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;Ashish Vaswani et al., the original paper on Transformer positional encoding and causal masking: &lt;a href="https://papers.nips.cc/paper/7181-attention-is-all-you-need.pdf" rel="noopener noreferrer"&gt;&lt;em&gt;Attention Is All You Need&lt;/em&gt;&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;ResceneAgent project source code and documentation: &lt;a href="https://github.com/Rescenix/ResceneAgent" rel="noopener noreferrer"&gt;GitHub&lt;/a&gt;
&lt;/li&gt;
&lt;/ol&gt;

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