<?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: Grigorii Sharapov</title>
    <description>The latest articles on DEV Community by Grigorii Sharapov (@grigorii_sharapov_2c2e8ad).</description>
    <link>https://dev.to/grigorii_sharapov_2c2e8ad</link>
    <image>
      <url>https://media2.dev.to/dynamic/image/width=90,height=90,fit=cover,gravity=auto,format=auto/https:%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Fuser%2Fprofile_image%2F1588321%2F5d8c7388-a3f9-4e7d-b70a-1dc4dd82b551.jpg</url>
      <title>DEV Community: Grigorii Sharapov</title>
      <link>https://dev.to/grigorii_sharapov_2c2e8ad</link>
    </image>
    <atom:link rel="self" type="application/rss+xml" href="https://dev.to/feed/grigorii_sharapov_2c2e8ad"/>
    <language>en</language>
    <item>
      <title>State-as-Files: A Manifesto for Multi-Session Agent Work</title>
      <dc:creator>Grigorii Sharapov</dc:creator>
      <pubDate>Mon, 11 May 2026 18:34:51 +0000</pubDate>
      <link>https://dev.to/grigorii_sharapov_2c2e8ad/state-as-files-a-manifesto-for-multi-session-agent-work-cd0</link>
      <guid>https://dev.to/grigorii_sharapov_2c2e8ad/state-as-files-a-manifesto-for-multi-session-agent-work-cd0</guid>
      <description>&lt;h1&gt;
  
  
  State-as-Files: A Manifesto for Multi-Session Agent Work
&lt;/h1&gt;

&lt;p&gt;You open a new session with an AI agent. Context from the last session — empty. You re-explain why, what for, what's already been done, what you decided about point three. An hour lost before the first useful task.&lt;/p&gt;

&lt;p&gt;Is this normal? No. It's a symptom of one simple antipattern: state lives in chat.&lt;/p&gt;

&lt;h2&gt;
  
  
  Chat-as-memory — where it breaks
&lt;/h2&gt;

&lt;p&gt;Chat is convenient. You type, the agent answers, everything in flow. On short tasks it works perfectly.&lt;/p&gt;

&lt;p&gt;But chat is an ephemeral thing. And as soon as a task stops fitting in a single session, the losses begin:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Session closed — state lost.&lt;/li&gt;
&lt;li&gt;Context window full — state partially lost (and worst of all: you don't know which part fell out).&lt;/li&gt;
&lt;li&gt;A different agent — state fully lost.&lt;/li&gt;
&lt;li&gt;A colleague picks up the work — they have none of your state.&lt;/li&gt;
&lt;li&gt;A day passed — your own head forgot the state.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Large tasks (a codebase audit across four services, a migration of 18,000 records, a literature review of 80 papers, an estimation project covering hundreds of stories before a hard deadline) &lt;strong&gt;do not fit in one session&lt;/strong&gt;. Never. They run for days, weeks, sometimes months. And every new session is a loss.&lt;/p&gt;

&lt;p&gt;The symptoms are familiar:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;"I asked this last week."&lt;/li&gt;
&lt;li&gt;"Wait, what did we decide about X?"&lt;/li&gt;
&lt;li&gt;"The agent doesn't understand what we've already finished."&lt;/li&gt;
&lt;li&gt;"We discussed this — go open the Tuesday chat."&lt;/li&gt;
&lt;li&gt;Interpretive drift — each session quietly rewrites prior decisions, slightly.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;The worst part: the failures aren't loud. Nothing crashes with a stack trace. The project just slowly rots under a layer of "I forgot," "we re-decided," "let me start from a different angle." Two weeks in, no one knows where things stand or what's trustworthy.&lt;/p&gt;

&lt;h2&gt;
  
  
  The idea: state in files, chat stays live
&lt;/h2&gt;

&lt;p&gt;A parallel from the world of code. Git has been around for 20 years. We long ago stopped arguing about whether code lives in files or in IDE state. The IDE is a working tool. Files are the single source of truth. Close the IDE — you've lost nothing. Open a different one — keep going. Share with a colleague — share files, not your workspace.&lt;/p&gt;

&lt;p&gt;The same principle works for agent-driven tasks:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Chat&lt;/strong&gt; is live working memory &lt;strong&gt;inside one session&lt;/strong&gt;. Back-and-forth, iteration, thinking out loud.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Files&lt;/strong&gt; are memory &lt;strong&gt;across sessions&lt;/strong&gt;. The project goal, the stage plan, the stage-plans, the artifacts, the blockers — everything under git history.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Chat isn't killed. It stays live, a working instrument. But when the session ends, nothing important is left there. Everything is in files. The next session — yours, another agent's, a colleague's — opens the files and continues.&lt;/p&gt;

&lt;p&gt;That's state-as-files. The rest is mechanics.&lt;/p&gt;

&lt;h2&gt;
  
  
  Principles
&lt;/h2&gt;

&lt;h3&gt;
  
  
  1. The project goal lives in the plan, under version
&lt;/h3&gt;

&lt;p&gt;The plan opens with the project's goal. One sentence, &lt;strong&gt;measurable&lt;/strong&gt;. Not "improve onboarding," but "reduce drop-off at step 3 from 40% to 25%." Not "clean up the requirements," but "classify 1,200 stories into keep/kill/fix by May 13." Measurability is what gives you a "finish" check — without it the agent doesn't know when the work is done, and drifts or loops.&lt;/p&gt;

&lt;p&gt;No "we'll discuss later," no "roughly understood," no "we'll figure it out as we go." The goal is explicit, in a file, readable in two seconds.&lt;/p&gt;

&lt;p&gt;What this buys you. Every session — yours tomorrow, another agent's, a colleague's — starts by reading the goal. Nobody drifts on "what are we even doing." The agent doesn't slide into an adjacent problem over five sessions. The project's finale is checked against what's written on line one, not against your interpretation of the goal three weeks in.&lt;/p&gt;

&lt;p&gt;The goal changes — you write &lt;code&gt;PLAN-v2.md&lt;/code&gt; with an explicit diff against v1 in the header: "added stage S-05 after the PM review on 2026-05-11." v1 doesn't get edited, isn't deleted, stays archived. A README points at the current version. Changing the goal is a deliberate act, recorded in git history, visible as a two-line diff.&lt;/p&gt;

&lt;p&gt;The same rule applies to the rest of the plan: stages, exit criteria, constraints. The plan is a strategic snapshot, frozen per version. A mutating plan rots: sub-stages multiply (&lt;code&gt;S-04&lt;/code&gt; → &lt;code&gt;S-04a&lt;/code&gt; → &lt;code&gt;S-04b&lt;/code&gt;), status markers contradict reality, two weeks in nobody trusts the document. Immutability is what preserves trust in v1 at the moment its version was frozen. It happens rarely (most projects ship on v1). But v1 is always a working snapshot.&lt;/p&gt;

&lt;h3&gt;
  
  
  2. One stage-plan = one session handoff
&lt;/h3&gt;

&lt;p&gt;Each session produces exactly &lt;strong&gt;one&lt;/strong&gt; stage-plan for the next agent (or for you tomorrow). Never "I'll update the old SP" — that's how you turn a snapshot into a mutating document.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;Agent A finishes → writes SP-003 → Agent B
reads PLAN-current + SP-003 → executes →
writes artifacts + a new SP-004 for Agent C
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;ID convention: &lt;code&gt;SP-001&lt;/code&gt;, &lt;code&gt;SP-002&lt;/code&gt;, &lt;code&gt;SP-003&lt;/code&gt; — a global sequential counter across the whole project. Parallel branches of work get encoded in the &lt;code&gt;Scope:&lt;/code&gt; field in the SP header, not by mangling the numbering.&lt;/p&gt;

&lt;p&gt;The SP header carries short context for the next agent: what the previous one learned, decided, ran into. Five to fifteen lines. Enough that a cold session can open and not ask "wait, why are we doing this at all."&lt;/p&gt;

&lt;h3&gt;
  
  
  3. Every pass ends with a verify block
&lt;/h3&gt;

&lt;p&gt;An artifact without a verify block is an unfinished artifact. The end of every pass requires:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Total items processed: N&lt;/li&gt;
&lt;li&gt;Counts by bucket / class / label: …&lt;/li&gt;
&lt;li&gt;Three random samples quoted by ID&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Why. Counts catch fan-out bugs. If a pass processed 480 of 500 items, you'll see it. Without verify it surfaces two passes downstream, when debugging is painful.&lt;/p&gt;

&lt;p&gt;Samples catch silent misclassification. A reviewer reads three IDs, decides whether to trust the whole batch. Without samples the first wrong call surfaces only at the end, when redoing the work is expensive.&lt;/p&gt;

&lt;p&gt;It's cheap (five lines at the bottom of an artifact) and saves hours over the long run.&lt;/p&gt;

&lt;h3&gt;
  
  
  4. One pass = one lens
&lt;/h3&gt;

&lt;p&gt;Don't mix passes. Dedup is its own pass. Classification is its own pass. Code review is its own pass. Never "while I'm here, I'll clean up the noise too."&lt;/p&gt;

&lt;p&gt;Why. A mixed-lens pass is unreviewable. A reviewer can't read 500 items of mixed output and trust anything. The diff becomes unreadable. Worse: errors from one lens hide errors from another. When something goes wrong, you can't tell which logic produced it.&lt;/p&gt;

&lt;p&gt;Single-lens passes produce clean, comparable diffs and recoverable failures. This isn't pedantry — it's engineering.&lt;/p&gt;

&lt;h3&gt;
  
  
  5. Hard time-box per pass
&lt;/h3&gt;

&lt;p&gt;You scheduled the pass for 90 minutes — close it at 90 minutes. Didn't finish — write the remainder into the handoff section and open a new SP for the continuation.&lt;/p&gt;

&lt;p&gt;Why. Overrunning passes turn into multi-lens passes — the operator silently adds "while I'm here" work. Or into context-window failures — the agent runs out of working memory and starts hallucinating. A hard time-box keeps each pass clean.&lt;/p&gt;

&lt;h3&gt;
  
  
  6. Commits as part of the protocol
&lt;/h3&gt;

&lt;p&gt;Each closed SP is a commit. Each artifact batch is a commit. A plan bump is a commit with the diff in the body.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight conf"&gt;&lt;code&gt;[&lt;span class="n"&gt;SP&lt;/span&gt;-&lt;span class="m"&gt;007&lt;/span&gt;] &lt;span class="n"&gt;close&lt;/span&gt;: &lt;span class="n"&gt;dep&lt;/span&gt;-&lt;span class="n"&gt;update&lt;/span&gt; &lt;span class="n"&gt;service&lt;/span&gt;-&lt;span class="n"&gt;d&lt;/span&gt;
[&lt;span class="n"&gt;SP&lt;/span&gt;-&lt;span class="m"&gt;007&lt;/span&gt;] &lt;span class="n"&gt;A&lt;/span&gt;-&lt;span class="m"&gt;01&lt;/span&gt;..&lt;span class="n"&gt;A&lt;/span&gt;-&lt;span class="m"&gt;02&lt;/span&gt;: &lt;span class="n"&gt;dep&lt;/span&gt; &lt;span class="n"&gt;audit&lt;/span&gt; + &lt;span class="n"&gt;apply&lt;/span&gt; &lt;span class="n"&gt;log&lt;/span&gt;
[&lt;span class="n"&gt;SP&lt;/span&gt;-&lt;span class="m"&gt;006&lt;/span&gt;] &lt;span class="n"&gt;close&lt;/span&gt;: &lt;span class="n"&gt;dep&lt;/span&gt;-&lt;span class="n"&gt;update&lt;/span&gt; &lt;span class="n"&gt;service&lt;/span&gt;-&lt;span class="n"&gt;c&lt;/span&gt;
[&lt;span class="n"&gt;PLAN&lt;/span&gt;-&lt;span class="n"&gt;v2&lt;/span&gt;] &lt;span class="n"&gt;bump&lt;/span&gt; &lt;span class="n"&gt;from&lt;/span&gt; &lt;span class="n"&gt;v1&lt;/span&gt;: &lt;span class="n"&gt;added&lt;/span&gt; &lt;span class="n"&gt;dep&lt;/span&gt;-&lt;span class="n"&gt;update&lt;/span&gt; &lt;span class="n"&gt;stage&lt;/span&gt;
[&lt;span class="n"&gt;blocker&lt;/span&gt;] &lt;span class="n"&gt;domain&lt;/span&gt;: &lt;span class="n"&gt;license&lt;/span&gt;-&lt;span class="n"&gt;X&lt;/span&gt; &lt;span class="n"&gt;compatibility&lt;/span&gt;?
[&lt;span class="n"&gt;SP&lt;/span&gt;-&lt;span class="m"&gt;005&lt;/span&gt;] &lt;span class="n"&gt;close&lt;/span&gt;: &lt;span class="n"&gt;dep&lt;/span&gt;-&lt;span class="n"&gt;update&lt;/span&gt; &lt;span class="n"&gt;service&lt;/span&gt;-&lt;span class="n"&gt;b&lt;/span&gt;
…
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;code&gt;git log --oneline&lt;/code&gt; reads as a handoff timeline. A new agent scrolls the log and gets the &lt;strong&gt;entire project narrative in 20 lines&lt;/strong&gt;. No status docs, no weekly updates, no storytelling. The history is already there.&lt;/p&gt;

&lt;h3&gt;
  
  
  7. Coupling by ID, not by hyperlink
&lt;/h3&gt;

&lt;p&gt;Don't put links from the plan to stage-plans. No &lt;code&gt;[See SP-003](../stage-plan/SP-003.md)&lt;/code&gt; in the plan's body. Just prose: &lt;code&gt;See SP-003.&lt;/code&gt;&lt;/p&gt;

&lt;p&gt;Why. Plans evolve, SPs split, links rot. &lt;code&gt;PLAN-v1&lt;/code&gt; linked to &lt;code&gt;SP-003&lt;/code&gt;; later &lt;code&gt;SP-003&lt;/code&gt; got superseded by &lt;code&gt;SP-007&lt;/code&gt; — link broken. The diff between plan versions becomes noisy with link churn instead of strategy.&lt;/p&gt;

&lt;p&gt;ID-only coupling is stable. A grep for &lt;code&gt;SP-003&lt;/code&gt; finds current state in any tool. An ID outlives a filesystem path.&lt;/p&gt;

&lt;h3&gt;
  
  
  8. Frozen state families
&lt;/h3&gt;

&lt;p&gt;If you have a classification (priority-&lt;em&gt;, severity-&lt;/em&gt;, kind-&lt;em&gt;) — once it's assigned in a given stage, the label **freezes&lt;/em&gt;*. Reclassification without an explicit apply-log entry is forbidden.&lt;/p&gt;

&lt;p&gt;Why. If &lt;code&gt;severity-high&lt;/code&gt; can flip back two stages later, every downstream pass has to recheck the whole batch. Late-bound state has enormous fan-out cost. Freezing is what lets &lt;code&gt;S-05&lt;/code&gt; trust &lt;code&gt;S-03&lt;/code&gt;'s output without re-running.&lt;/p&gt;

&lt;p&gt;The escape hatch stays: relabeling is allowed, but only through a deliberate apply-log entry. On purpose. Recorded. Not "by accident."&lt;/p&gt;

&lt;h2&gt;
  
  
  Antipatterns
&lt;/h2&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Antipattern&lt;/th&gt;
&lt;th&gt;What breaks&lt;/th&gt;
&lt;th&gt;Fix&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;"I'll just update PLAN.md in place"&lt;/td&gt;
&lt;td&gt;Trust in the plan erodes; the diff is lost&lt;/td&gt;
&lt;td&gt;Write PLAN-vN+1, archive vN&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;"This pass will also clean up the noise"&lt;/td&gt;
&lt;td&gt;Errors hide in a mixed diff; unreviewable&lt;/td&gt;
&lt;td&gt;Cleanup is its own pass&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;"Small pass, I'll skip the verify block"&lt;/td&gt;
&lt;td&gt;Fan-out bugs surface three passes downstream&lt;/td&gt;
&lt;td&gt;Verify block always&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;"The SP is taking longer, I'll extend it"&lt;/td&gt;
&lt;td&gt;Stale handoff; multi-lens drift&lt;/td&gt;
&lt;td&gt;Close as done with overflow note; open next SP&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;"PLAN-v1 links to SP-003 § Findings"&lt;/td&gt;
&lt;td&gt;Link rot when an SP is superseded&lt;/td&gt;
&lt;td&gt;Reference by ID in prose&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;"I'll relabel a few without a log entry"&lt;/td&gt;
&lt;td&gt;Downstream can't trust upstream&lt;/td&gt;
&lt;td&gt;Apply-log decision entry first&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;"I remember in chat what we decided"&lt;/td&gt;
&lt;td&gt;The next session loses the context&lt;/td&gt;
&lt;td&gt;Write it into the SP or HANDOFF.json&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;h2&gt;
  
  
  The template
&lt;/h2&gt;

&lt;p&gt;I packaged all of this into a template repo: &lt;strong&gt;&lt;a href="https://github.com/socaseinpoint/stage-pass-template" rel="noopener noreferrer"&gt;github.com/socaseinpoint/stage-pass-template&lt;/a&gt;&lt;/strong&gt;.&lt;/p&gt;

&lt;p&gt;What's inside:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Directory structure (&lt;code&gt;plans/&lt;/code&gt;, &lt;code&gt;stage-plan/&lt;/code&gt;, &lt;code&gt;artifacts/&lt;/code&gt;, &lt;code&gt;workspace/&lt;/code&gt;, &lt;code&gt;.planning/&lt;/code&gt;)&lt;/li&gt;
&lt;li&gt;File templates (&lt;code&gt;_template.md&lt;/code&gt; for PLAN, SP, artifacts)&lt;/li&gt;
&lt;li&gt;A &lt;code&gt;CLAUDE.md&lt;/code&gt; starter — fill in for your project (state families, gotchas, workspace policy)&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;docs/PROTOCOL.md&lt;/code&gt; — framework specification&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;docs/WHY.md&lt;/code&gt; — rationale for every rule plus an antipattern table&lt;/li&gt;
&lt;li&gt;Three abstract scenario walkthroughs (codebase audit, data migration, research review) — each shows how the protocol lands on a different class of work&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;The minimal loop:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="c"&gt;# 1. Clone the template under your project&lt;/span&gt;
git clone https://github.com/socaseinpoint/stage-pass-template.git my-project
&lt;span class="nb"&gt;cd &lt;/span&gt;my-project
&lt;span class="nb"&gt;rm&lt;/span&gt; &lt;span class="nt"&gt;-rf&lt;/span&gt; .git &lt;span class="o"&gt;&amp;amp;&amp;amp;&lt;/span&gt; git init      &lt;span class="c"&gt;# start your own history&lt;/span&gt;

&lt;span class="c"&gt;# 2. Fill in conventions&lt;/span&gt;
&lt;span class="nv"&gt;$EDITOR&lt;/span&gt; CLAUDE.md            &lt;span class="c"&gt;# replace &amp;lt;...&amp;gt; placeholders&lt;/span&gt;
                             &lt;span class="c"&gt;# state families, workspace policy, gotchas&lt;/span&gt;

&lt;span class="c"&gt;# 3. Write the first plan version&lt;/span&gt;
&lt;span class="nb"&gt;cp &lt;/span&gt;plans/_template.md plans/PLAN-v1.md
&lt;span class="nv"&gt;$EDITOR&lt;/span&gt; plans/PLAN-v1.md
&lt;span class="nv"&gt;$EDITOR&lt;/span&gt; plans/PLAN-current.md   &lt;span class="c"&gt;# point at PLAN-v1.md&lt;/span&gt;

&lt;span class="c"&gt;# 4. Open the first session handoff&lt;/span&gt;
&lt;span class="nb"&gt;cp &lt;/span&gt;stage-plan/_template.md stage-plan/SP-001-collect-inputs.md
&lt;span class="nv"&gt;$EDITOR&lt;/span&gt; stage-plan/SP-001-collect-inputs.md

&lt;span class="c"&gt;# 5. Work. Drop artifacts as the pass runs.&lt;/span&gt;
&lt;span class="nb"&gt;mkdir&lt;/span&gt; &lt;span class="nt"&gt;-p&lt;/span&gt; artifacts/SP-001
&lt;span class="nv"&gt;$EDITOR&lt;/span&gt; artifacts/SP-001/A-01-inventory.md
&lt;span class="nv"&gt;$EDITOR&lt;/span&gt; artifacts/SP-001/A-02-apply-log.md   &lt;span class="c"&gt;# verify block lives here&lt;/span&gt;

&lt;span class="c"&gt;# 6. Close the SP with a commit (sp status → done)&lt;/span&gt;
git add &lt;span class="nt"&gt;-A&lt;/span&gt;
git commit &lt;span class="nt"&gt;-m&lt;/span&gt; &lt;span class="s2"&gt;"[SP-001] close: collect inputs"&lt;/span&gt;

&lt;span class="c"&gt;# 7. Next session — new SP, same loop&lt;/span&gt;
&lt;span class="nb"&gt;cp &lt;/span&gt;stage-plan/_template.md stage-plan/SP-002-classify.md
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;After 3-4 SPs the loop becomes automatic. After 10, &lt;code&gt;git log --oneline&lt;/code&gt; already reads like a project map.&lt;/p&gt;

&lt;h2&gt;
  
  
  Where the value is
&lt;/h2&gt;

&lt;p&gt;The framework only earns its keep at the intersection of three conditions. All three have to hold at once — drop any one and the protocol turns into overhead.&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;The goal is measurable.&lt;/strong&gt; There's a way to check "did we get there or not." "Cut P95 latency by 30%," "classify 18k stories into six buckets," "estimate the project by May 13." Without measurability the agent doesn't know when it's done — it drifts or loops.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;Many iterations with agents.&lt;/strong&gt; The task doesn't fit in one session. Days, weeks, sometimes months. Multiple agents in a chain — or you-tomorrow as "another agent." If one session covers it, no handoff is needed and the framework is overhead.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;Every step through manual validation.&lt;/strong&gt; Verify block, artifact review, explicit SP closure by a human. This is &lt;strong&gt;supervised agent work&lt;/strong&gt;, not an autonomous loop. Want full autonomy without a human in the loop — that's a different template.&lt;/p&gt;&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;Typical work in the value zone: codebase audits, data migrations, multi-pass classification, large-scope estimation, research reviews, long refactors.&lt;/p&gt;

&lt;p&gt;Drop measurability — the agent drifts. Drop iterativity — the overhead isn't justified. Drop manual validation — silent errors accumulate. All three or none.&lt;/p&gt;

&lt;h2&gt;
  
  
  Closing
&lt;/h2&gt;

&lt;p&gt;The idea is simple. State in files, chat stays live. Git and its apologists have done this for code for 20 years — nobody argues anymore. For long-running work with AI agents it's just as critical, because agents remember the previous session &lt;strong&gt;even worse&lt;/strong&gt; than humans do.&lt;/p&gt;

&lt;p&gt;Chat is working memory. Files are memory across sessions. When chat dies, the work shouldn't die with it.&lt;/p&gt;




&lt;p&gt;&lt;em&gt;Template: &lt;a href="https://github.com/socaseinpoint/stage-pass-template" rel="noopener noreferrer"&gt;github.com/socaseinpoint/stage-pass-template&lt;/a&gt;&lt;/em&gt;&lt;br&gt;
&lt;em&gt;Published: 2026-05-11&lt;/em&gt;&lt;/p&gt;

</description>
      <category>claude</category>
      <category>productivity</category>
      <category>opensource</category>
    </item>
  </channel>
</rss>
