<?xml version="1.0" encoding="UTF-8"?><rss xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:content="http://purl.org/rss/1.0/modules/content/" xmlns:atom="http://www.w3.org/2005/Atom" version="2.0"><channel><title><![CDATA[Engineered by Saket]]></title><description><![CDATA[Engineering notes from someone who needs to know why things work: systems, security, developer tools and AI agents. I learn by building and breaking.]]></description><link>https://engineeredbysaket.hashnode.dev</link><image><url>https://cdn.hashnode.com/uploads/logos/6aeffac1ed2d82a0b04d8b0f/ef6b332d-9de4-4835-9e2c-c2de6867b572.jpg</url><title>Engineered by Saket</title><link>https://engineeredbysaket.hashnode.dev</link></image><generator>RSS for Node</generator><lastBuildDate>Mon, 09 Nov 2026 11:53:27 GMT</lastBuildDate><atom:link href="https://engineeredbysaket.hashnode.dev/rss.xml" rel="self" type="application/rss+xml"/><language><![CDATA[en]]></language><ttl>60</ttl><item><title><![CDATA[I deleted plan.md. My AI agent now plans, logs and proves its work in one file.]]></title><description><![CDATA[I merged my AI agent's plan and progress log into one progress.md, with proof for every tick, and built a Claude Code pane that shows it live.]]></description><link>https://engineeredbysaket.hashnode.dev/i-deleted-plan-md</link><guid isPermaLink="true">https://engineeredbysaket.hashnode.dev/i-deleted-plan-md</guid><category><![CDATA[claude]]></category><category><![CDATA[claude-code]]></category><category><![CDATA[AI]]></category><category><![CDATA[Developer Tools]]></category><category><![CDATA[Productivity]]></category><category><![CDATA[Open Source]]></category><dc:creator><![CDATA[Saket Suman]]></dc:creator><pubDate>Sun, 08 Nov 2026 05:07:18 GMT</pubDate><enclosure url="https://cdn.hashnode.com/uploads/covers/6aeffac1ed2d82a0b04d8b0f/350d15e7-5321-4d6f-ac9d-f81d40da9225.png" length="0" type="image/jpeg"/><content:encoded><![CDATA[<p>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.</p>
<p>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.</p>
<h2>What I started with</h2>
<p>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:</p>
<blockquote>
<p><code>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.</code></p>
</blockquote>
<p>That became the <code>progress-log</code> 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.</p>
<p>None of this is a new idea. Anthropic's <a href="https://www.anthropic.com/engineering/effective-context-engineering-for-ai-agents">guide to context engineering</a> 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</p>
<blockquote>
<p>"regularly writes notes persisted to memory outside of the context window" [1].</p>
</blockquote>
<p>Keeping the window small matters too: Chroma's <a href="https://www.trychroma.com/research/context-rot">context rot study</a> found that model performance</p>
<blockquote>
<p>"grows increasingly unreliable as input length grows" [2].</p>
</blockquote>
<p>The skill is my attempt to make those two habits automatic.</p>
<h2>Why <a href="http://plan.md">plan.md</a> was the wrong second file</h2>
<p>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.</p>
<p>That sounds like a reason to keep them apart. In practice, three things went wrong:</p>
<ul>
<li><strong>Compaction.</strong> After a compact, the hook restores the end of <code>progress.md</code>. A separate <code>plan.md</code> would not come back on its own.</li>
<li><strong>Visibility.</strong> The timeline pane reads one file. A plan outside it never shows.</li>
<li><strong>Drift.</strong> With two files, the plan says one thing while the log has moved on, and nothing notices.</li>
</ul>
<img src="https://cdn.hashnode.com/uploads/covers/6aeffac1ed2d82a0b04d8b0f/de2a181b-7beb-42d1-b365-88386ce9f93f.png" alt="Before: plan.md drifts from progress.md. After: one progress.md with goal, subtasks and evidence." style="display:block;margin:0 auto" />

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

### OAuth
- [x] Callback route, 6 tests pass
- [ ] (background) Run the full test suite
### Sessions
- [ ] Session expiry

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

| Goal | Evidence | Achieved |
|---|---|---|
| New user reaches dashboard | e2e test passes | Yes |
</code></pre>
<p>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 <code>(background)</code> and <code>(subagent)</code> say how each subtask runs, so the plan doubles as a work order.</p>
<p>Here is the loop the hooks run around that file. Claude Code fires a <code>PreCompact</code> hook before compaction and a <code>SessionStart</code> hook whose matcher includes <code>compact</code> when the session resumes after one [3]:</p>
<img src="https://cdn.hashnode.com/uploads/covers/6aeffac1ed2d82a0b04d8b0f/33e7641a-6c65-4497-aa0b-0f2dd7bba044.png" alt="The loop: work a subtask, tick only with proof, compact when a group finishes, hooks restore the log." style="display:block;margin:0 auto" />

<h3>It's ReAct, written down</h3>
<p>The loop isn't new either. In 2022, <a href="https://arxiv.org/abs/2210.03629">ReAct</a> showed that language models do better when they</p>
<blockquote>
<p>"generate both reasoning traces and task-specific actions in an interleaved manner" [5]</p>
</blockquote>
<p>Think, act, look at the result, think again.</p>
<p>Claude Code's agent already works this way.</p>
<p>What <code>progress.md</code> adds is a place for that loop to live outside the context window:</p>
<table>
<thead>
<tr>
<th>ReAct step</th>
<th>In <a href="http://progress.md">progress.md</a></th>
</tr>
</thead>
<tbody><tr>
<td>Thought</td>
<td>The goal, the groups and the next unticked box</td>
</tr>
<tr>
<td>Action</td>
<td>The agent works that subtask</td>
</tr>
<tr>
<td>Observation</td>
<td>The evidence: a test result, a command output, a PR</td>
</tr>
</tbody></table>
<p>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.</p>
<h2>The pane</h2>
<p>A log nobody reads is a diary. I wanted it in front of me while I work, so I built <code>progress-timeline</code>, 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.</p>
<img src="https://cdn.hashnode.com/uploads/covers/6aeffac1ed2d82a0b04d8b0f/d5ecec0a-7520-4fa3-bba2-94589767c32c.png" alt="" style="display:block;margin:0 auto" />

<p>My review of the first working version, verbatim:</p>
<blockquote>
<p><code>this looks awesome? thankyou!!!!</code></p>
</blockquote>
<p>Engineering standards remain high.</p>
<h2>Get it</h2>
<ul>
<li>The repository: <a href="https://github.com/iaintsaket/how-saket-claudes">how-saket-claudes</a></li>
<li>The skill: <a href="https://github.com/iaintsaket/how-saket-claudes/tree/main/skills/progress-log">progress-log</a></li>
<li>The pane: <a href="https://github.com/iaintsaket/how-saket-claudes/tree/main/plugins/progress-timeline">progress-timeline</a></li>
</ul>
<p>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]:</p>
<pre><code class="language-bash">claude plugin install progress-timeline --marketplace iaintsaket/how-saket-claudes
</code></pre>
<p>The skill's compaction reminders need Claude Code hooks and Python 3. Setup steps are in <a href="https://github.com/iaintsaket/how-saket-claudes/blob/main/skills/progress-log/references/hooks-setup.md">hooks-setup.md</a> in the repository.</p>
<h2>Before you copy this</h2>
<ul>
<li><strong>It is a convention, not magic.</strong> The pane only reads the format above, so any tool or person can write the file.</li>
<li><strong>The agent still makes mistakes.</strong> The evidence column exists so you can check its claims instead of trusting them.</li>
<li><strong>The pane needs room.</strong> Claude Code only opens it unasked in a wide terminal. In a narrow one, run <code>/progress-timeline</code> to open it yourself. It docks on the right, and that can't be changed.</li>
</ul>
<p>If you try it, tell me what broke for you.</p>
<h2>References</h2>
<ol>
<li>Anthropic Applied AI team, <a href="https://www.anthropic.com/engineering/effective-context-engineering-for-ai-agents">Effective context engineering for AI agents</a>, 29 September 2025.</li>
<li>Kelly Hong, Anton Troynikov and Jeff Huber, <a href="https://www.trychroma.com/research/context-rot">Context Rot: How Increasing Input Tokens Impacts LLM Performance</a>, Chroma technical report, 14 July 2025.</li>
<li>Claude Code documentation, <a href="https://code.claude.com/docs/en/hooks">Hooks reference</a>.</li>
<li>Claude Code documentation, <a href="https://code.claude.com/docs/en/plugins">Plugins overview</a>.</li>
<li>Shunyu Yao, Jeffrey Zhao, Dian Yu, Nan Du, Izhak Shafran, Karthik Narasimhan and Yuan Cao, <a href="https://arxiv.org/abs/2210.03629">ReAct: Synergizing Reasoning and Acting in Language Models</a>, arXiv:2210.03629, 6 October 2022.</li>
</ol>
]]></content:encoded></item></channel></rss>