<?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: Wissem Boughamoura</title>
    <description>The latest articles on DEV Community by Wissem Boughamoura (@wissemb1_boughamoura_fcf0).</description>
    <link>https://dev.to/wissemb1_boughamoura_fcf0</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%2F4119218%2F1b0999bb-6ecf-4295-8862-229a8d679d06.png</url>
      <title>DEV Community: Wissem Boughamoura</title>
      <link>https://dev.to/wissemb1_boughamoura_fcf0</link>
    </image>
    <atom:link rel="self" type="application/rss+xml" href="https://dev.to/feed/wissemb1_boughamoura_fcf0"/>
    <language>en</language>
    <item>
      <title>I stopped letting the conversation be my project state</title>
      <dc:creator>Wissem Boughamoura</dc:creator>
      <pubDate>Mon, 14 Sep 2026 15:25:34 +0000</pubDate>
      <link>https://dev.to/wissemb1_boughamoura_fcf0/i-stopped-letting-the-conversation-be-my-project-state-7i4</link>
      <guid>https://dev.to/wissemb1_boughamoura_fcf0/i-stopped-letting-the-conversation-be-my-project-state-7i4</guid>
      <description>&lt;p&gt;The failure that started this was boring. A long session doing a change across several files would redo something it had already done. Not dramatically. It would just re-edit a file it had finished twenty minutes earlier, or mark a task complete based on what the conversation said rather than what was actually in the repo.&lt;/p&gt;

&lt;p&gt;I tried the obvious things. Better system prompts. Stern reminders. A summary at the top of every message. They all worked for a few turns and then degraded, because they were all stored in the exact same place as the thing that was failing: the conversation buffer.&lt;/p&gt;

&lt;p&gt;So I moved the state out of the chat window and onto disk.&lt;/p&gt;

&lt;p&gt;A plan is now a markdown file in the repository. One row per task. Each row is a strict contract: what the task is, what it depends on, how to verify it before touching code, which role runs it, and whether an independent model validated it:&lt;/p&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;#&lt;/th&gt;
&lt;th&gt;Requires&lt;/th&gt;
&lt;th&gt;Dep&lt;/th&gt;
&lt;th&gt;Task&lt;/th&gt;
&lt;th&gt;Verify&lt;/th&gt;
&lt;th&gt;P&lt;/th&gt;
&lt;th&gt;Est. Time (mins)&lt;/th&gt;
&lt;th&gt;Worker (Suggested)&lt;/th&gt;
&lt;th&gt;Validator (Suggested)&lt;/th&gt;
&lt;th&gt;☐ Done&lt;/th&gt;
&lt;th&gt;☐ Valid&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;1&lt;/td&gt;
&lt;td&gt;🔨 Worker&lt;/td&gt;
&lt;td&gt;—&lt;/td&gt;
&lt;td&gt;Fix prop types in WBCode&lt;/td&gt;
&lt;td&gt;/wbTest --scope=task-1&lt;/td&gt;
&lt;td&gt;P1&lt;/td&gt;
&lt;td&gt;15&lt;/td&gt;
&lt;td&gt;-M=$WORKER&lt;/td&gt;
&lt;td&gt;-M=$VALIDATOR&lt;/td&gt;
&lt;td&gt;✅&lt;/td&gt;
&lt;td&gt;✅ 9/10&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;2&lt;/td&gt;
&lt;td&gt;🔨 Worker&lt;/td&gt;
&lt;td&gt;1&lt;/td&gt;
&lt;td&gt;Extract helpers into wbc-utils&lt;/td&gt;
&lt;td&gt;npm test&lt;/td&gt;
&lt;td&gt;P1&lt;/td&gt;
&lt;td&gt;30&lt;/td&gt;
&lt;td&gt;-M=$WORKER&lt;/td&gt;
&lt;td&gt;-M=$VALIDATOR&lt;/td&gt;
&lt;td&gt;✅&lt;/td&gt;
&lt;td&gt;✅ 8/10&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;3&lt;/td&gt;
&lt;td&gt;✅ Validator&lt;/td&gt;
&lt;td&gt;2&lt;/td&gt;
&lt;td&gt;Audit exports for safety&lt;/td&gt;
&lt;td&gt;/wbAudit --focus=exports&lt;/td&gt;
&lt;td&gt;P0&lt;/td&gt;
&lt;td&gt;20&lt;/td&gt;
&lt;td&gt;—&lt;/td&gt;
&lt;td&gt;-M=$VALIDATOR&lt;/td&gt;
&lt;td&gt;⬜&lt;/td&gt;
&lt;td&gt;⬜&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;4&lt;/td&gt;
&lt;td&gt;🧠 Planner&lt;/td&gt;
&lt;td&gt;2&lt;/td&gt;
&lt;td&gt;Plan parser migration&lt;/td&gt;
&lt;td&gt;/wbAudit wb-parser&lt;/td&gt;
&lt;td&gt;P2&lt;/td&gt;
&lt;td&gt;45&lt;/td&gt;
&lt;td&gt;—&lt;/td&gt;
&lt;td&gt;—&lt;/td&gt;
&lt;td&gt;⬜&lt;/td&gt;
&lt;td&gt;⬜&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;That was the architectural starting point. Once the workflow state became explicit and persistent, several other things became possible:&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;The session stopped mattering.&lt;/strong&gt; Context compacts, a provider hits a rate limit, a run crashes overnight. None of that loses your progress. A new session opens the plan file, inspects the unchecked rows, and knows exactly where the work stands without needing a 20-minute re-explanation.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Dependencies became real data.&lt;/strong&gt; Once a row specifies what it depends on (&lt;code&gt;Dep: 1&lt;/code&gt;), parallelization and execution order can be derived deterministically from the dependency graph instead of something you hold in your head and pray the agent remembers.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;The check moved to before the work.&lt;/strong&gt; The &lt;code&gt;Verify&lt;/code&gt; column gets written when the plan is authored, not after the task runs. Deciding how you will know a task succeeded &lt;em&gt;before&lt;/em&gt; touching code is completely different from evaluating output when you are already psychologically invested in it.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Handoff stopped being a lossy transfer.&lt;/strong&gt; Every agent reads the same codebase context and the same plan file. The next model picks up where the last one stopped. There is nothing to compress, because project state was never an ephemeral chat blob. The conversation became a working surface, not the source of truth. The repository became the source of truth.&lt;/p&gt;

&lt;p&gt;What it costs: the unstructured exploratory chat is gone. Anything that did not become a task or a report does not survive. That is a real trade-off and I would not pretend otherwise.&lt;/p&gt;

&lt;p&gt;I eventually packaged this pattern into an open-source tool called &lt;strong&gt;&lt;a href="https://github.com/wissemb11/wb-flow" rel="noopener noreferrer"&gt;wb-flow&lt;/a&gt;&lt;/strong&gt;. It keeps plans, task state, execution evidence, and validation artifacts in the repository, while the coding agent remains replaceable:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;npx wb-flow
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;The conversation can disappear. The engineering state shouldn't.&lt;/p&gt;

</description>
      <category>ai</category>
      <category>agents</category>
      <category>productivity</category>
      <category>showdev</category>
    </item>
  </channel>
</rss>
