<?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: Saket Suman</title>
    <description>The latest articles on DEV Community by Saket Suman (@engineeredbysaket).</description>
    <link>https://dev.to/engineeredbysaket</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%2F4233344%2F79ca4818-329b-4c51-bb37-39682f646822.jpg</url>
      <title>DEV Community: Saket Suman</title>
      <link>https://dev.to/engineeredbysaket</link>
    </image>
    <atom:link rel="self" type="application/rss+xml" href="https://dev.to/feed/engineeredbysaket"/>
    <language>en</language>
    <item>
      <title>I deleted plan.md. My AI agent now plans, logs and proves its work in one file.</title>
      <dc:creator>Saket Suman</dc:creator>
      <pubDate>Sun, 08 Nov 2026 09:18:14 +0000</pubDate>
      <link>https://dev.to/engineeredbysaket/i-deleted-planmd-my-ai-agent-now-plans-logs-and-proves-its-work-in-one-file-32jn</link>
      <guid>https://dev.to/engineeredbysaket/i-deleted-planmd-my-ai-agent-now-plans-logs-and-proves-its-work-in-one-file-32jn</guid>
      <description>&lt;p&gt;Most AI coding setups keep two documents: a plan the agent writes once, and notes/memory it forgets to update. By Tuesday the plan describes a project that no longer exists.&lt;/p&gt;

&lt;p&gt;I had a progress log and was about to add a plan file next to it. Then I asked the obvious question: do these two need to be separate files? They didn't. Here is what I changed and where you can take it.&lt;/p&gt;

&lt;h2&gt;
  
  
  What I started with
&lt;/h2&gt;

&lt;p&gt;My brief was short: keep a log of which subtasks are done, tell me when to compact, and tell the compactor what to throw away. In my words:&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;&lt;code&gt;make sure that it reminds to compact? so that it is not losing context for the next set of tasks and saving on the credits.&lt;/code&gt;&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;That became the &lt;code&gt;progress-log&lt;/code&gt; skill for Claude Code. A hook reminds the agent to compact between groups of work, gives the compactor rules on what to keep and what to drop, and restores the log afterwards. A fresh context no longer means a fresh start.&lt;/p&gt;

&lt;p&gt;None of this is a new idea. Anthropic's &lt;a href="https://www.anthropic.com/engineering/effective-context-engineering-for-ai-agents" rel="noopener noreferrer"&gt;guide to context engineering&lt;/a&gt; names both halves: compaction, which summarises a conversation near the context limit and starts a new window from the summary, and structured note-taking, where the agent&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;"regularly writes notes persisted to memory outside of the context window" [1].&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;Keeping the window small matters too: Chroma's &lt;a href="https://www.trychroma.com/research/context-rot" rel="noopener noreferrer"&gt;context rot study&lt;/a&gt; found that model performance&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;"grows increasingly unreliable as input length grows" [2].&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;The skill is my attempt to make those two habits automatic.&lt;/p&gt;

&lt;h2&gt;
  
  
  Why &lt;a href="http://plan.md" rel="noopener noreferrer"&gt;plan.md&lt;/a&gt; was the wrong second file
&lt;/h2&gt;

&lt;p&gt;A plan and a log answer different questions. The plan says what we are doing and why. The log says where we are now. The plan changes rarely; the log changes after every subtask.&lt;/p&gt;

&lt;p&gt;That sounds like a reason to keep them apart. In practice, three things went wrong:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Compaction.&lt;/strong&gt; After a compact, the hook restores the end of &lt;code&gt;progress.md&lt;/code&gt;. A separate &lt;code&gt;plan.md&lt;/code&gt; would not come back on its own.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Visibility.&lt;/strong&gt; The timeline pane reads one file. A plan outside it never shows.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Drift.&lt;/strong&gt; With two files, the plan says one thing while the log has moved on, and nothing notices.&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%2Fdj53l5o66qbkg2nwzrpx.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%2Fdj53l5o66qbkg2nwzrpx.png" alt="Before: plan.md drifts from progress.md. After: one progress.md with goal, subtasks and evidence." width="800" height="352"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;So the plan moved into the log, and the agent is told never to create a &lt;code&gt;plan.md&lt;/code&gt; at all. Each task section now carries its goal, its groups of subtasks, and its proof:&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="gu"&gt;## Add login (2026-11-06)&lt;/span&gt;
Goal: users can sign in with Google. Done means a new user reaches the dashboard.

&lt;span class="gu"&gt;### OAuth&lt;/span&gt;
&lt;span class="p"&gt;-&lt;/span&gt; [x] Callback route, 6 tests pass
&lt;span class="p"&gt;-&lt;/span&gt; [ ] (background) Run the full test suite
&lt;span class="gu"&gt;### Sessions&lt;/span&gt;
&lt;span class="p"&gt;-&lt;/span&gt; [ ] Session expiry

Notes: chose cookies over JWT because we need server-side logout.

| Goal | Evidence | Achieved |
|---|---|---|
| New user reaches dashboard | e2e test passes | Yes |
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;The rule that makes it work: a box is ticked only when a test, a command result or a PR shows the work is done. "Done" without evidence stays unticked. Labels such as &lt;code&gt;(background)&lt;/code&gt; and &lt;code&gt;(subagent)&lt;/code&gt; say how each subtask runs, so the plan doubles as a work order.&lt;/p&gt;

&lt;p&gt;Here is the loop the hooks run around that file. Claude Code fires a &lt;code&gt;PreCompact&lt;/code&gt; hook before compaction and a &lt;code&gt;SessionStart&lt;/code&gt; hook whose matcher includes &lt;code&gt;compact&lt;/code&gt; when the session resumes after one [3]:&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%2Fbmpzlgy4l4fg6d8mml0t.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%2Fbmpzlgy4l4fg6d8mml0t.png" alt="The loop: work a subtask, tick only with proof, compact when a group finishes, hooks restore the log." width="800" height="1439"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h3&gt;
  
  
  It's ReAct, written down
&lt;/h3&gt;

&lt;p&gt;The loop isn't new either. In 2022, &lt;a href="https://arxiv.org/abs/2210.03629" rel="noopener noreferrer"&gt;ReAct&lt;/a&gt; showed that language models do better when they&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;"generate both reasoning traces and task-specific actions in an interleaved manner" [5]&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;Think, act, look at the result, think again.&lt;/p&gt;

&lt;p&gt;Claude Code's agent already works this way.&lt;/p&gt;

&lt;p&gt;What &lt;code&gt;progress.md&lt;/code&gt; adds is a place for that loop to live outside the context window:&lt;/p&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;ReAct step&lt;/th&gt;
&lt;th&gt;In &lt;a href="http://progress.md" rel="noopener noreferrer"&gt;progress.md&lt;/a&gt;
&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;Thought&lt;/td&gt;
&lt;td&gt;The goal, the groups and the next unticked box&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Action&lt;/td&gt;
&lt;td&gt;The agent works that subtask&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Observation&lt;/td&gt;
&lt;td&gt;The evidence: a test result, a command output, a PR&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;In ReAct the trace sits in the model's context, so in a long session it gets summarised away at the next compaction. Here it's written to a file and survives. The evidence column is the observation step you can audit.&lt;/p&gt;

&lt;h2&gt;
  
  
  The pane
&lt;/h2&gt;

&lt;p&gt;A log nobody reads is a diary. I wanted it in front of me while I work, so I built &lt;code&gt;progress-timeline&lt;/code&gt;, a Claude Code mod that shows the log as a timeline in a pane beside the chat. Green is done, yellow is in progress, grey is planned. It opens by itself when a new plan appears.&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%2Fxxx8t5275aw6rpv3t4xa.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%2Fxxx8t5275aw6rpv3t4xa.png" alt="The progress-timeline pane beside the Claude Code chat, showing subtasks as green (done), yellow (in progress) and grey (planned)." width="800" height="758"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;My review of the first working version, verbatim:&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;&lt;code&gt;this looks awesome? thankyou!!!!&lt;/code&gt;&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;Engineering standards remain high.&lt;/p&gt;

&lt;h2&gt;
  
  
  Get it
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;The repository: &lt;a href="https://github.com/iaintsaket/how-saket-claudes" rel="noopener noreferrer"&gt;how-saket-claudes&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;The skill: &lt;a href="https://github.com/iaintsaket/how-saket-claudes/tree/main/skills/progress-log" rel="noopener noreferrer"&gt;progress-log&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;The pane: &lt;a href="https://github.com/iaintsaket/how-saket-claudes/tree/main/plugins/progress-timeline" rel="noopener noreferrer"&gt;progress-timeline&lt;/a&gt;
&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Install the pane from the repository's plugin marketplace. In Claude Code, a marketplace is "a catalog that lists plugins and where to fetch each one" [4]:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;claude plugin &lt;span class="nb"&gt;install &lt;/span&gt;progress-timeline &lt;span class="nt"&gt;--marketplace&lt;/span&gt; iaintsaket/how-saket-claudes
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;The skill's compaction reminders need Claude Code hooks and Python 3. Setup steps are in &lt;a href="https://github.com/iaintsaket/how-saket-claudes/blob/main/skills/progress-log/references/hooks-setup.md" rel="noopener noreferrer"&gt;hooks-setup.md&lt;/a&gt; in the repository.&lt;/p&gt;

&lt;h2&gt;
  
  
  Before you copy this
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;It is a convention, not magic.&lt;/strong&gt; The pane only reads the format above, so any tool or person can write the file.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;The agent still makes mistakes.&lt;/strong&gt; The evidence column exists so you can check its claims instead of trusting them.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;The pane needs room.&lt;/strong&gt; Claude Code only opens it unasked in a wide terminal. In a narrow one, run &lt;code&gt;/progress-timeline&lt;/code&gt; to open it yourself. It docks on the right, and that can't be changed.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;If you try it, tell me what broke for you.&lt;/p&gt;

&lt;h2&gt;
  
  
  References
&lt;/h2&gt;

&lt;ol&gt;
&lt;li&gt;Anthropic Applied AI team, &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;, 29 September 2025.&lt;/li&gt;
&lt;li&gt;Kelly Hong, Anton Troynikov and Jeff Huber, &lt;a href="https://www.trychroma.com/research/context-rot" rel="noopener noreferrer"&gt;Context Rot: How Increasing Input Tokens Impacts LLM Performance&lt;/a&gt;, Chroma technical report, 14 July 2025.&lt;/li&gt;
&lt;li&gt;Claude Code documentation, &lt;a href="https://code.claude.com/docs/en/hooks" rel="noopener noreferrer"&gt;Hooks reference&lt;/a&gt;.&lt;/li&gt;
&lt;li&gt;Claude Code documentation, &lt;a href="https://code.claude.com/docs/en/plugins" rel="noopener noreferrer"&gt;Plugins overview&lt;/a&gt;.&lt;/li&gt;
&lt;li&gt;Shunyu Yao, Jeffrey Zhao, Dian Yu, Nan Du, Izhak Shafran, Karthik Narasimhan and Yuan Cao, &lt;a href="https://arxiv.org/abs/2210.03629" rel="noopener noreferrer"&gt;ReAct: Synergizing Reasoning and Acting in Language Models&lt;/a&gt;, arXiv:2210.03629, 6 October 2022.&lt;/li&gt;
&lt;/ol&gt;

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