<?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: Marvin Ma</title>
    <description>The latest articles on DEV Community by Marvin Ma (@marvin_ma_597e184518c2221).</description>
    <link>https://dev.to/marvin_ma_597e184518c2221</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%2F3556164%2F4aca7263-c448-434b-8875-35938a6ee8f4.png</url>
      <title>DEV Community: Marvin Ma</title>
      <link>https://dev.to/marvin_ma_597e184518c2221</link>
    </image>
    <atom:link rel="self" type="application/rss+xml" href="https://dev.to/feed/marvin_ma_597e184518c2221"/>
    <language>en</language>
    <item>
      <title>AI Made Development Faster. Testing Needs to Stop Living in Spreadsheets.</title>
      <dc:creator>Marvin Ma</dc:creator>
      <pubDate>Wed, 17 Jun 2026 03:29:24 +0000</pubDate>
      <link>https://dev.to/marvin_ma_597e184518c2221/ai-made-development-faster-testing-needs-to-stop-living-in-spreadsheets-4ap0</link>
      <guid>https://dev.to/marvin_ma_597e184518c2221/ai-made-development-faster-testing-needs-to-stop-living-in-spreadsheets-4ap0</guid>
      <description>&lt;p&gt;AI agents are making software development faster.&lt;/p&gt;

&lt;p&gt;That is great.&lt;/p&gt;

&lt;p&gt;But there is a problem I do not think we are talking about enough:&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;testing is not speeding up in the same way.&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;In many teams, testing is still held together by spreadsheets, meeting notes, screenshots, chat messages, and the memory of a few experienced QA engineers.&lt;/p&gt;

&lt;p&gt;That worked when delivery was slower.&lt;/p&gt;

&lt;p&gt;It becomes fragile when one developer can use multiple agents to change code across several modules in a single afternoon.&lt;/p&gt;

&lt;p&gt;The bottleneck is no longer "can we write more test cases?"&lt;/p&gt;

&lt;p&gt;The bottleneck is:&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;Can the team prove what was tested, why it was tested, what failed, what was fixed, and whether the release is safe?&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;That is the problem I built &lt;code&gt;testboat&lt;/code&gt; for.&lt;/p&gt;

&lt;h2&gt;
  
  
  The Most Dangerous Sentence Before A Release
&lt;/h2&gt;

&lt;p&gt;The sentence I worry about most is not:&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;We did not test this.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;At least that is honest.&lt;/p&gt;

&lt;p&gt;The dangerous sentence is:&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;I think we tested this.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;That sentence usually means the team has test artifacts, but they are disconnected:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;requirements live in a doc&lt;/li&gt;
&lt;li&gt;test cases live in a spreadsheet&lt;/li&gt;
&lt;li&gt;automation scripts live somewhere in the repo&lt;/li&gt;
&lt;li&gt;execution results live in CI logs or chat&lt;/li&gt;
&lt;li&gt;bugs live in an issue tracker&lt;/li&gt;
&lt;li&gt;release reports are written manually before sign-off&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Each piece may be useful on its own.&lt;/p&gt;

&lt;p&gt;But when a Tech Lead asks, "Which requirements are not covered?" or a founder asks, "Can we release today?", the team has to reconstruct the answer manually.&lt;/p&gt;

&lt;p&gt;That is not a testing process.&lt;/p&gt;

&lt;p&gt;That is institutional memory under pressure.&lt;/p&gt;

&lt;h2&gt;
  
  
  AI Makes This Gap Worse
&lt;/h2&gt;

&lt;p&gt;AI agents are very good at increasing throughput.&lt;/p&gt;

&lt;p&gt;They can:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;implement a feature faster&lt;/li&gt;
&lt;li&gt;refactor code faster&lt;/li&gt;
&lt;li&gt;generate UI faster&lt;/li&gt;
&lt;li&gt;write automation faster&lt;/li&gt;
&lt;li&gt;fix bugs faster&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;But faster change creates more testing uncertainty.&lt;/p&gt;

&lt;p&gt;If an agent changes the authentication module, what should be rerun?&lt;/p&gt;

&lt;p&gt;If a test fails, is it a product bug, a flaky automation script, or an environment issue?&lt;/p&gt;

&lt;p&gt;If a developer says "fixed", has the failed test actually been rerun?&lt;/p&gt;

&lt;p&gt;If a release report says "main flows passed", where is the evidence?&lt;/p&gt;

&lt;p&gt;Without a structured system, QA becomes the human buffer. Tech Leads become risk translators. Founders buy uncertainty with every release.&lt;/p&gt;

&lt;p&gt;That is not sustainable.&lt;/p&gt;

&lt;h2&gt;
  
  
  Testing Needs To Become An Engineering System
&lt;/h2&gt;

&lt;p&gt;&lt;code&gt;testboat&lt;/code&gt; treats test artifacts like code.&lt;/p&gt;

&lt;p&gt;It creates a &lt;code&gt;.testboat/&lt;/code&gt; directory in your project:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;.testboat/
  .active
  draft/
    strategy.yaml
    tags.yaml
    cases/
      TC-001.yaml
    bugs/
      BUG-001.yaml
    executions/
      plans/
      results/
      execution-matrix.yaml
      automate/
    reports/
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;The important part is not "YAML is nice."&lt;/p&gt;

&lt;p&gt;The important part is &lt;strong&gt;connection&lt;/strong&gt;.&lt;/p&gt;

&lt;p&gt;A requirement connects to a test case through &lt;code&gt;req_id&lt;/code&gt;.&lt;/p&gt;

&lt;p&gt;A test case connects to an execution plan.&lt;/p&gt;

&lt;p&gt;An execution plan connects to an automation script.&lt;/p&gt;

&lt;p&gt;A result connects back to the test case.&lt;/p&gt;

&lt;p&gt;A bug can connect to both the test case and the failing result.&lt;/p&gt;

&lt;p&gt;The latest execution state is summarized in an execution matrix.&lt;/p&gt;

&lt;p&gt;Reports are generated from the same artifacts, not written from memory.&lt;/p&gt;

&lt;p&gt;That changes the conversation.&lt;/p&gt;

&lt;p&gt;Instead of asking:&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;Did we test login?&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;You can ask:&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;Show me every auth test case, its latest result, open bugs, and whether the release exit criteria passed.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;h2&gt;
  
  
  What QA Gets
&lt;/h2&gt;

&lt;p&gt;QA should not have to be the team's memory database.&lt;/p&gt;

&lt;p&gt;With &lt;code&gt;testboat&lt;/code&gt;, a test case is a structured file:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight yaml"&gt;&lt;code&gt;&lt;span class="na"&gt;id&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;TC-001&lt;/span&gt;
&lt;span class="na"&gt;title&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;Login with wrong password returns &lt;/span&gt;&lt;span class="m"&gt;401&lt;/span&gt;
&lt;span class="na"&gt;status&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;ready&lt;/span&gt;
&lt;span class="na"&gt;priority&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;P1&lt;/span&gt;
&lt;span class="na"&gt;automation&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;to-automate&lt;/span&gt;
&lt;span class="na"&gt;tags&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
  &lt;span class="na"&gt;sprint&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;v1.0&lt;/span&gt;
  &lt;span class="na"&gt;type&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;functional&lt;/span&gt;
  &lt;span class="na"&gt;module&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;auth&lt;/span&gt;
&lt;span class="na"&gt;req_id&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;STORY-001&lt;/span&gt;
&lt;span class="na"&gt;steps&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
  &lt;span class="pi"&gt;-&lt;/span&gt; &lt;span class="na"&gt;action&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;Enter wrong password&lt;/span&gt;
    &lt;span class="na"&gt;expected&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;API returns &lt;/span&gt;&lt;span class="m"&gt;401&lt;/span&gt;
&lt;span class="na"&gt;expected_result&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;User sees a clear error message&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;It is diffable.&lt;/p&gt;

&lt;p&gt;It is reviewable.&lt;/p&gt;

&lt;p&gt;It has a state:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;draft -&amp;gt; ready -&amp;gt; pass / fail / blocked / skipped
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;That means QA can maintain testing facts instead of constantly answering questions from memory.&lt;/p&gt;

&lt;h2&gt;
  
  
  What Tech Leads Get
&lt;/h2&gt;

&lt;p&gt;Tech Leads need quality gates, not just good intentions.&lt;/p&gt;

&lt;p&gt;&lt;code&gt;testboat validate&lt;/code&gt; runs pre-report checks:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;format validation&lt;/li&gt;
&lt;li&gt;requirements coverage&lt;/li&gt;
&lt;li&gt;execution completeness&lt;/li&gt;
&lt;li&gt;exit criteria compliance&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;That last part matters.&lt;/p&gt;

&lt;p&gt;Your &lt;code&gt;strategy.yaml&lt;/code&gt; can define severity rules and exit criteria. For example, P0 and P1 bugs must be zero before release.&lt;/p&gt;

&lt;p&gt;So the report is not just a nice HTML page.&lt;/p&gt;

&lt;p&gt;It is generated after the system checks whether the release evidence is healthy enough.&lt;/p&gt;

&lt;p&gt;This is the kind of thing that can eventually belong in CI.&lt;/p&gt;

&lt;h2&gt;
  
  
  What Founders And Managers Get
&lt;/h2&gt;

&lt;p&gt;Founders do not need to read every test case.&lt;/p&gt;

&lt;p&gt;But they do need release confidence.&lt;/p&gt;

&lt;p&gt;"Main flows passed" is not enough.&lt;/p&gt;

&lt;p&gt;The useful questions are:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;how many test cases exist?&lt;/li&gt;
&lt;li&gt;how many passed?&lt;/li&gt;
&lt;li&gt;how many were not executed?&lt;/li&gt;
&lt;li&gt;which requirements are uncovered?&lt;/li&gt;
&lt;li&gt;how many open P0/P1 bugs remain?&lt;/li&gt;
&lt;li&gt;did the release satisfy exit criteria?&lt;/li&gt;
&lt;li&gt;can we trace failures back to bugs and fixes?&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;code&gt;testboat&lt;/code&gt; generates strategy, sprint, and closure reports from the actual test artifacts.&lt;/p&gt;

&lt;p&gt;That gives leadership evidence instead of vibes.&lt;/p&gt;

&lt;h2&gt;
  
  
  Where AI Agents Fit
&lt;/h2&gt;

&lt;p&gt;The goal is not to replace QA.&lt;/p&gt;

&lt;p&gt;The goal is to give AI agents a testing workflow they can follow.&lt;/p&gt;

&lt;p&gt;&lt;code&gt;testboat enable&lt;/code&gt; creates agent-specific instructions for tools like Claude, Copilot, Cursor, Kiro, and others.&lt;/p&gt;

&lt;p&gt;An agent can then follow a repeatable SOP:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;check the active test version&lt;/li&gt;
&lt;li&gt;read the strategy&lt;/li&gt;
&lt;li&gt;inspect registered tags&lt;/li&gt;
&lt;li&gt;create or update test cases&lt;/li&gt;
&lt;li&gt;validate test cases&lt;/li&gt;
&lt;li&gt;create execution plans&lt;/li&gt;
&lt;li&gt;run automation or guide manual testing&lt;/li&gt;
&lt;li&gt;record results&lt;/li&gt;
&lt;li&gt;file bugs on failures&lt;/li&gt;
&lt;li&gt;rerun affected tests after fixes&lt;/li&gt;
&lt;li&gt;validate before reporting&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;That is the difference between "AI wrote some tests" and "AI participated in the testing lifecycle."&lt;/p&gt;

&lt;h2&gt;
  
  
  A Small Example
&lt;/h2&gt;

&lt;p&gt;If the auth module changed, you should not ask:&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;Can someone test login?&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;You should be able to do this:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;testboat &lt;span class="k"&gt;case&lt;/span&gt; list &lt;span class="nt"&gt;--module&lt;/span&gt; auth
testboat matrix show
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Then rerun the affected tests and record results:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;testboat result record TC-001 pass &lt;span class="nt"&gt;--type&lt;/span&gt; automated &lt;span class="nt"&gt;--by&lt;/span&gt; &lt;span class="s2"&gt;"AI"&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;If a failure appears:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;testboat bug add &lt;span class="se"&gt;\&lt;/span&gt;
  &lt;span class="nt"&gt;--title&lt;/span&gt; &lt;span class="s2"&gt;"Wrong password returns 500 instead of 401"&lt;/span&gt; &lt;span class="se"&gt;\&lt;/span&gt;
  &lt;span class="nt"&gt;--tc&lt;/span&gt; TC-001 &lt;span class="se"&gt;\&lt;/span&gt;
  &lt;span class="nt"&gt;--severity&lt;/span&gt; major &lt;span class="se"&gt;\&lt;/span&gt;
  &lt;span class="nt"&gt;--priority&lt;/span&gt; P1
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;And after the fix, the bug should not jump straight to "closed."&lt;/p&gt;

&lt;p&gt;It should move through retest:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;fixed -&amp;gt; pending-retest -&amp;gt; verified -&amp;gt; closed
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;That is the loop teams need when development is moving faster.&lt;/p&gt;

&lt;h2&gt;
  
  
  Why I Think This Matters Now
&lt;/h2&gt;

&lt;p&gt;AI is making code cheaper to produce.&lt;/p&gt;

&lt;p&gt;That does not automatically make releases safer.&lt;/p&gt;

&lt;p&gt;If anything, it makes weak testing systems more visible.&lt;/p&gt;

&lt;p&gt;The next layer of AI engineering is not just faster code generation.&lt;/p&gt;

&lt;p&gt;It is turning the surrounding engineering practices into systems that agents can participate in.&lt;/p&gt;

&lt;p&gt;Testing is one of those practices.&lt;/p&gt;

&lt;p&gt;That is why I built &lt;code&gt;testboat&lt;/code&gt;.&lt;/p&gt;

&lt;p&gt;Not to generate more test cases.&lt;/p&gt;

&lt;p&gt;To make testing traceable, reviewable, versioned, validated, and reportable.&lt;/p&gt;

&lt;h2&gt;
  
  
  Try It
&lt;/h2&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;pip &lt;span class="nb"&gt;install &lt;/span&gt;testboat
testboat init
testboat &lt;span class="nb"&gt;enable &lt;/span&gt;cursor
testboat strategy create
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Project:&lt;/p&gt;

&lt;p&gt;&lt;a href="https://github.com/lijma/testboat" rel="noopener noreferrer"&gt;https://github.com/lijma/testboat&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Docs:&lt;/p&gt;

&lt;p&gt;&lt;a href="https://lijma.github.io/testboat/" rel="noopener noreferrer"&gt;https://lijma.github.io/testboat/&lt;/a&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  Question
&lt;/h2&gt;

&lt;p&gt;How does your team know a release is actually ready?&lt;/p&gt;

&lt;p&gt;Is that answer stored in a system, or mostly in people's heads?&lt;/p&gt;

</description>
      <category>ai</category>
      <category>testing</category>
      <category>devtools</category>
      <category>productivity</category>
    </item>
    <item>
      <title>What's causing you more rework with AI right now?</title>
      <dc:creator>Marvin Ma</dc:creator>
      <pubDate>Tue, 10 Mar 2026 08:44:57 +0000</pubDate>
      <link>https://dev.to/marvin_ma_597e184518c2221/whats-causing-you-more-rework-with-ai-right-now-33l0</link>
      <guid>https://dev.to/marvin_ma_597e184518c2221/whats-causing-you-more-rework-with-ai-right-now-33l0</guid>
      <description>&lt;p&gt;What's causing you more rework with AI right now?&lt;/p&gt;

&lt;p&gt;Session resets, wrong requirements, unreadable docs, or team context drift?&lt;/p&gt;

&lt;p&gt;My take: wrong requirements cost the most, but session resets hide the problem until late.&lt;/p&gt;

&lt;p&gt;What hurts more in your workflow?&lt;/p&gt;

</description>
      <category>ai</category>
      <category>discuss</category>
      <category>llm</category>
      <category>productivity</category>
    </item>
    <item>
      <title>My AI Agent Forgot Yesterday's Debugging. So I Changed the Workflow.</title>
      <dc:creator>Marvin Ma</dc:creator>
      <pubDate>Mon, 09 Mar 2026 09:44:23 +0000</pubDate>
      <link>https://dev.to/marvin_ma_597e184518c2221/my-ai-agent-forgot-yesterdays-debugging-so-i-changed-the-workflow-1lp6</link>
      <guid>https://dev.to/marvin_ma_597e184518c2221/my-ai-agent-forgot-yesterdays-debugging-so-i-changed-the-workflow-1lp6</guid>
      <description>&lt;p&gt;AI coding sessions do not usually fail because the model is weak. They fail because yesterday's debugging conclusions disappear when the chat ends. Yesterday I spent 2 hours debugging an auth refresh bug, and this morning my AI agent still remembered the mutex, the wrong storage key, and the exact files we changed.&lt;/p&gt;

&lt;p&gt;That changed how I think about AI workflows. I used to think the fix was a better prompt or a bigger context window. It wasn't.&lt;/p&gt;

&lt;p&gt;What fixed it was much simpler: move the useful context out of the chat and into the repo.&lt;/p&gt;

&lt;h2&gt;
  
  
  The Failure Moment
&lt;/h2&gt;

&lt;p&gt;If you use AI coding agents regularly, you've probably had this happen:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;Day 1:
You: Help me debug this token refresh loop.
AI: Finds the issue after a long back-and-forth.

Day 2:
You: What edge cases should we test for that fix?
AI: Can you share the relevant code and explain the bug first?
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;That second answer is the real tax of AI-assisted coding.&lt;/p&gt;

&lt;p&gt;The model may be smart. The session may be long. But if yesterday's conclusions are trapped inside yesterday's conversation, today still starts from zero.&lt;/p&gt;

&lt;h2&gt;
  
  
  The Bug Wasn't Trivial
&lt;/h2&gt;

&lt;p&gt;The concrete example here was a token refresh loop in a React + Node.js app.&lt;/p&gt;

&lt;p&gt;After a long debugging session, the useful conclusions were:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;the refresh endpoint returned a new access token, but the client stored it under the wrong key&lt;/li&gt;
&lt;li&gt;two concurrent API calls could trigger refresh at the same time&lt;/li&gt;
&lt;li&gt;the fix needed a mutex, a consistent &lt;code&gt;access_token&lt;/code&gt; key, and a debounce on refresh&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Those are exactly the kinds of details that matter the next day.&lt;/p&gt;

&lt;p&gt;Not the whole codebase. Not the whole architecture. Just the things we already paid to learn.&lt;/p&gt;

&lt;h2&gt;
  
  
  What Changed
&lt;/h2&gt;

&lt;p&gt;Instead of letting that knowledge die in the session, I persisted it to the project itself.&lt;/p&gt;

&lt;p&gt;With &lt;code&gt;fcontext&lt;/code&gt;, the agent writes important conclusions to &lt;code&gt;.fcontext/_topics/&lt;/code&gt; as plain Markdown.&lt;/p&gt;

&lt;p&gt;So instead of this:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;Yesterday's debugging -&amp;gt; lost in chat history
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;I get this:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;Yesterday's debugging -&amp;gt; .fcontext/_topics/auth-token-refresh-bug.md
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;That one change turns a temporary conversation into reusable project knowledge.&lt;/p&gt;

&lt;h2&gt;
  
  
  The Smallest Workflow That Made It Work
&lt;/h2&gt;

&lt;p&gt;This is the shortest version:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;pip &lt;span class="nb"&gt;install &lt;/span&gt;fcontext
&lt;span class="nb"&gt;cd &lt;/span&gt;your-project
fcontext init
fcontext &lt;span class="nb"&gt;enable &lt;/span&gt;copilot
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;That creates a &lt;code&gt;.fcontext/&lt;/code&gt; directory and gives the agent instructions to read it at the start of each session.&lt;/p&gt;

&lt;p&gt;The important part is not the setup itself. The important part is the workflow:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;work with the agent normally&lt;/li&gt;
&lt;li&gt;when the session reaches a useful conclusion, save it as project context&lt;/li&gt;
&lt;li&gt;let the next session read that context before you start asking follow-up questions&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;In practice, the useful file looks more like this:&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;# Auth Token Refresh Bug — Root Cause Analysis&lt;/span&gt;

&lt;span class="gu"&gt;## Problem&lt;/span&gt;
&lt;span class="p"&gt;1.&lt;/span&gt; Client stores refreshed token in &lt;span class="sb"&gt;`sessionStorage.token`&lt;/span&gt;
   but reads from &lt;span class="sb"&gt;`sessionStorage.access_token`&lt;/span&gt;
&lt;span class="p"&gt;2.&lt;/span&gt; Concurrent API calls trigger duplicate refresh attempts

&lt;span class="gu"&gt;## Fix Applied&lt;/span&gt;
&lt;span class="p"&gt;-&lt;/span&gt; Added refresh mutex in &lt;span class="sb"&gt;`src/auth/tokenManager.ts`&lt;/span&gt;
&lt;span class="p"&gt;-&lt;/span&gt; Fixed storage key to &lt;span class="sb"&gt;`access_token`&lt;/span&gt;
&lt;span class="p"&gt;-&lt;/span&gt; Added debounce in &lt;span class="sb"&gt;`src/api/client.ts`&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Now the next session does not need to rediscover the bug. It can build on it.&lt;/p&gt;

&lt;h2&gt;
  
  
  Why This Worked Better Than a Better Prompt
&lt;/h2&gt;

&lt;p&gt;I think this is the part most people underestimate.&lt;/p&gt;

&lt;p&gt;Prompting helps you describe what you want right now.&lt;/p&gt;

&lt;p&gt;It does not automatically preserve what you learned yesterday.&lt;/p&gt;

&lt;p&gt;A bigger context window helps you fit more tokens into one conversation.&lt;/p&gt;

&lt;p&gt;It does not automatically convert yesterday's hard-won debugging conclusions into durable project state.&lt;/p&gt;

&lt;p&gt;That is why I no longer think of AI context as "the chat so far." I think of it as something closer to project memory.&lt;/p&gt;

&lt;p&gt;If the insight matters tomorrow, it should exist somewhere more stable than a conversation tab.&lt;/p&gt;

&lt;h2&gt;
  
  
  The Real Payoff
&lt;/h2&gt;

&lt;p&gt;The next morning, the follow-up question becomes much more useful:&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;Is there anything else related to the token refresh fix that we should test?&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;And instead of asking me to restate the entire bug, the agent can respond with things like:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;test expired refresh tokens during an active request&lt;/li&gt;
&lt;li&gt;test concurrent refresh attempts after the mutex change&lt;/li&gt;
&lt;li&gt;test whether debounce hides a legitimate retry path&lt;/li&gt;
&lt;li&gt;test the exact files changed in the previous fix&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;That is the workflow improvement I actually care about.&lt;/p&gt;

&lt;p&gt;Not "AI remembers everything magically."&lt;/p&gt;

&lt;p&gt;Just: the next session starts from the last useful conclusion, not from polite amnesia.&lt;/p&gt;

&lt;h2&gt;
  
  
  Honest Limitation
&lt;/h2&gt;

&lt;p&gt;This is not magic memory.&lt;/p&gt;

&lt;p&gt;If the saved topic is vague, low quality, or missing the real conclusion, the next session will inherit weak context.&lt;/p&gt;

&lt;p&gt;So this approach does not remove the need for good engineering judgment. It makes good engineering judgment reusable.&lt;/p&gt;

&lt;p&gt;That distinction matters.&lt;/p&gt;

&lt;h2&gt;
  
  
  Why I Think This Matters More Than It Sounds
&lt;/h2&gt;

&lt;p&gt;Most AI coding discussions still focus on prompts, models, and context windows.&lt;/p&gt;

&lt;p&gt;Those matter.&lt;/p&gt;

&lt;p&gt;But in day-to-day delivery, I hit a more basic problem first: useful project knowledge keeps evaporating.&lt;/p&gt;

&lt;p&gt;Once I treated context as repo state instead of chat residue, the quality of follow-up sessions improved immediately.&lt;/p&gt;

&lt;p&gt;That feels like a more durable workflow change than endlessly rewriting the perfect prompt.&lt;/p&gt;

&lt;h2&gt;
  
  
  Try It Yourself
&lt;/h2&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;pip &lt;span class="nb"&gt;install &lt;/span&gt;fcontext
&lt;span class="nb"&gt;cd &lt;/span&gt;your-project
fcontext init
fcontext &lt;span class="nb"&gt;enable &lt;/span&gt;copilot
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Then use your agent on a real bug, save the conclusion, and come back the next day with a follow-up question.&lt;/p&gt;

&lt;p&gt;That is the fastest way to tell whether your AI workflow has memory or just momentum.&lt;/p&gt;

&lt;h2&gt;
  
  
  Question
&lt;/h2&gt;

&lt;p&gt;How are you handling cross-session context today?&lt;/p&gt;

&lt;p&gt;Are you still re-explaining important debugging sessions to each new agent, or are you treating project context as something worth persisting?&lt;/p&gt;

</description>
      <category>ai</category>
      <category>productivity</category>
      <category>opensource</category>
      <category>tutorial</category>
    </item>
    <item>
      <title>How to Give Your AI Coding Agent Persistent Memory in 30 Seconds</title>
      <dc:creator>Marvin Ma</dc:creator>
      <pubDate>Wed, 25 Feb 2026 16:54:01 +0000</pubDate>
      <link>https://dev.to/marvin_ma_597e184518c2221/how-to-give-your-ai-coding-agent-persistent-memory-in-30-seconds-3plc</link>
      <guid>https://dev.to/marvin_ma_597e184518c2221/how-to-give-your-ai-coding-agent-persistent-memory-in-30-seconds-3plc</guid>
      <description>&lt;p&gt;Your AI coding agent doesn't remember yesterday.&lt;/p&gt;

&lt;p&gt;You spent an hour debugging a tricky race condition, the AI understood every nuance — and this morning it asks you to "explain the project architecture." Again.&lt;/p&gt;

&lt;p&gt;By the end of this post, you'll have persistent memory working across sessions in under 30 seconds. I'll show you the exact terminal output at every step so you can follow along.&lt;/p&gt;

&lt;h2&gt;
  
  
  Prerequisites
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;Python 3.9+&lt;/li&gt;
&lt;li&gt;Any AI coding agent (Copilot, Claude Code, Cursor, Trae)&lt;/li&gt;
&lt;li&gt;A project you're actively working on&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  Step 1: Install and Initialize (15 seconds)
&lt;/h2&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;pip &lt;span class="nb"&gt;install &lt;/span&gt;fcontext
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;





&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;Successfully installed fcontext-1.0.0
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Navigate to your project and initialize:&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="nb"&gt;cd &lt;/span&gt;your-project
fcontext init
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;





&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;✓ Created .fcontext/
✓ Generated _README.md
✓ Generated _workspace.map
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;That's it. You now have a &lt;code&gt;.fcontext/&lt;/code&gt; directory:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;.fcontext/
├── _README.md          # Project summary — AI reads this first
├── _workspace.map      # Auto-generated project structure
├── _topics/            # Where AI saves session knowledge
├── _requirements/      # Optional: track stories/tasks/bugs
└── _cache/             # Optional: converted binary docs
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Everything is plain Markdown. No database, no cloud, no API keys.&lt;/p&gt;

&lt;h2&gt;
  
  
  Step 2: Enable Your Agent (15 seconds)
&lt;/h2&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;fcontext &lt;span class="nb"&gt;enable &lt;/span&gt;copilot
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;





&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;✓ Generated .github/instructions/fcontext.instructions.md
✓ Copilot will now read .fcontext/ on every session
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Using a different agent? Swap the name:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;fcontext &lt;span class="nb"&gt;enable &lt;/span&gt;claude    &lt;span class="c"&gt;# → .claude/rules/fcontext.md&lt;/span&gt;
fcontext &lt;span class="nb"&gt;enable &lt;/span&gt;cursor    &lt;span class="c"&gt;# → .cursor/rules/fcontext.md&lt;/span&gt;
fcontext &lt;span class="nb"&gt;enable &lt;/span&gt;trae      &lt;span class="c"&gt;# → .trae/rules/fcontext.md&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Each agent gets instructions in &lt;strong&gt;its native config format&lt;/strong&gt;. No plugins, no extensions — fcontext generates the standard config files that your agent already knows how to read.&lt;/p&gt;

&lt;p&gt;Want multiple agents? Enable them all:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;fcontext &lt;span class="nb"&gt;enable &lt;/span&gt;copilot &lt;span class="o"&gt;&amp;amp;&amp;amp;&lt;/span&gt; fcontext &lt;span class="nb"&gt;enable &lt;/span&gt;claude &lt;span class="o"&gt;&amp;amp;&amp;amp;&lt;/span&gt; fcontext &lt;span class="nb"&gt;enable &lt;/span&gt;cursor
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;They all read the same &lt;code&gt;.fcontext/&lt;/code&gt; data. Switch agents freely — no context loss.&lt;/p&gt;

&lt;h2&gt;
  
  
  Step 3: Verify It Works
&lt;/h2&gt;

&lt;p&gt;Check what you've set up:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;fcontext status
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;





&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;fcontext status
  Initialized: yes
  Agents: copilot, claude
  Topics: 0
  Requirements: 0
  Cached files: 0
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Now open your AI agent and start coding normally. Here's what happens behind the scenes:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;
&lt;strong&gt;Session starts&lt;/strong&gt; → Agent reads &lt;code&gt;_README.md&lt;/code&gt; and &lt;code&gt;_topics/&lt;/code&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;You work&lt;/strong&gt; → Agent builds understanding of your project&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Important discovery&lt;/strong&gt; → Agent saves it to &lt;code&gt;_topics/your-topic.md&lt;/code&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Session ends&lt;/strong&gt; → Knowledge persisted on disk&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Next session&lt;/strong&gt; → Agent reads everything from step 1 — full continuity&lt;/li&gt;
&lt;/ol&gt;

&lt;h2&gt;
  
  
  Real Example: Before and After
&lt;/h2&gt;

&lt;h3&gt;
  
  
  Before fcontext
&lt;/h3&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;# Monday session
You: "Help me debug the auth token refresh"
AI: [2 hours of deep debugging, finds race condition, adds mutex]

# Tuesday session
You: "What about edge cases in the auth fix?"
AI: "Could you provide more context about what you're working on?"

# 😤 starts re-explaining from scratch
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  After fcontext
&lt;/h3&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;# Monday session — same debugging work
# AI saves to .fcontext/_topics/auth-token-debugging.md:
#   - Race condition: concurrent API calls trigger duplicate refresh
#   - Fix: added mutex + storage key dedup + debounce
#   - TODO: test edge case with expired refresh token

# Tuesday session
You: "What about edge cases in the auth fix?"
AI: "Based on yesterday's debugging, the mutex handles concurrent
     refreshes. The edge case to test is an expired refresh token
     during an active request. Want me to write that test?"
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;No re-explaining. The AI picks up exactly where you left off.&lt;/p&gt;

&lt;h2&gt;
  
  
  Bonus: Index Your Documents
&lt;/h2&gt;

&lt;p&gt;Got PDFs, DOCX, or XLSX files in your project? Your AI can't read binary files — but fcontext can convert them:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;fcontext index docs/
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;





&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;✓ Indexed docs/product-requirements.pdf → _cache/docs/product-requirements.pdf.md
✓ Indexed docs/api-spec.docx → _cache/docs/api-spec.docx.md
2 files indexed
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Now your AI can reference those documents directly. No more copy-pasting from PDFs.&lt;/p&gt;

&lt;p&gt;Supported formats: PDF, DOCX, XLSX, PPTX, Keynote, EPUB.&lt;/p&gt;

&lt;h2&gt;
  
  
  Bonus: Track Requirements
&lt;/h2&gt;

&lt;p&gt;If your project has user stories or tasks scattered across Slack and docs:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;fcontext req add &lt;span class="s2"&gt;"OAuth login flow"&lt;/span&gt; &lt;span class="nt"&gt;-t&lt;/span&gt; story
fcontext req add &lt;span class="s2"&gt;"Support Google provider"&lt;/span&gt; &lt;span class="nt"&gt;-t&lt;/span&gt; task &lt;span class="nt"&gt;--parent&lt;/span&gt; STORY-001
fcontext req &lt;span class="nb"&gt;set &lt;/span&gt;TASK-001 status &lt;span class="k"&gt;in&lt;/span&gt;&lt;span class="nt"&gt;-progress&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;





&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;fcontext req board
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;





&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;📋 Board

TODO          IN-PROGRESS       DONE
─────────     ─────────         ────
              TASK-001
              Support Google
              provider

STORY-001
OAuth login
flow
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Your AI reads &lt;code&gt;_requirements/&lt;/code&gt; and builds against tracked specs — not guesses.&lt;/p&gt;

&lt;h2&gt;
  
  
  Common Gotchas
&lt;/h2&gt;

&lt;p&gt;&lt;strong&gt;"My AI didn't read .fcontext/ on first session"&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;After &lt;code&gt;fcontext enable&lt;/code&gt;, tell your AI: "Read .fcontext/_README.md and update it with the project info." It needs one nudge, then it maintains the file automatically.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;"Can I git-commit .fcontext/?"&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Yes — and you should. Your teammates pull the repo and get the same context. Their AI instantly knows the project.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;git add .fcontext/
git commit &lt;span class="nt"&gt;-m&lt;/span&gt; &lt;span class="s2"&gt;"add project context"&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;strong&gt;"What if I want to start fresh?"&lt;/strong&gt;&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;fcontext reset
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Gone. Clean slate.&lt;/p&gt;

&lt;h2&gt;
  
  
  The Numbers
&lt;/h2&gt;

&lt;p&gt;I tracked my context re-explanation time for two weeks. Week 1 without fcontext, week 2 with:&lt;/p&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Metric&lt;/th&gt;
&lt;th&gt;Without&lt;/th&gt;
&lt;th&gt;With fcontext&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;Daily context setup time&lt;/td&gt;
&lt;td&gt;~12 min&lt;/td&gt;
&lt;td&gt;~0 min&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Agent switching overhead&lt;/td&gt;
&lt;td&gt;~10 min&lt;/td&gt;
&lt;td&gt;0 min&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Weekly total waste&lt;/td&gt;
&lt;td&gt;~60 min&lt;/td&gt;
&lt;td&gt;~3 min&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;The time saving is nice. But the real win is &lt;strong&gt;answer quality&lt;/strong&gt; — an AI with accumulated project context gives better, more consistent responses than one starting from zero every morning.&lt;/p&gt;

&lt;h2&gt;
  
  
  TL;DR
&lt;/h2&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;pip &lt;span class="nb"&gt;install &lt;/span&gt;fcontext
fcontext init
fcontext &lt;span class="nb"&gt;enable &lt;/span&gt;copilot   &lt;span class="c"&gt;# or: claude, cursor, trae&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;30 seconds. Your AI now remembers.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;GitHub&lt;/strong&gt;: &lt;a href="https://github.com/lijma/agent-skill-fcontext" rel="noopener noreferrer"&gt;github.com/lijma/agent-skill-fcontext&lt;/a&gt;&lt;/p&gt;




&lt;p&gt;What's your current workaround for AI context loss? Curious how others are dealing with this — drop a comment 👇&lt;/p&gt;

</description>
      <category>ai</category>
      <category>productivity</category>
      <category>opensource</category>
      <category>tutorial</category>
    </item>
    <item>
      <title>I Built a Tool to Stop AI Coding Agents from Forgetting Everything Between Sessions</title>
      <dc:creator>Marvin Ma</dc:creator>
      <pubDate>Sun, 15 Feb 2026 09:15:15 +0000</pubDate>
      <link>https://dev.to/marvin_ma_597e184518c2221/i-built-a-tool-to-stop-ai-coding-agents-from-forgetting-everything-between-sessions-10ni</link>
      <guid>https://dev.to/marvin_ma_597e184518c2221/i-built-a-tool-to-stop-ai-coding-agents-from-forgetting-everything-between-sessions-10ni</guid>
      <description>&lt;h2&gt;
  
  
  The Problem: Every Session Starts from Zero
&lt;/h2&gt;

&lt;p&gt;If you use AI coding agents, you've experienced this:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;Session 1 (Copilot): "Build the auth module with OAuth support"
  → Great work. Deep debugging. Important decisions made.

Session 2 (Claude): "Can you continue the auth work?"
  → "What auth module? I don't see any context about OAuth."

Session 3 (Cursor): "We need to refactor the auth flow"
  → "Can you explain the project architecture first?"
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Every new session starts from zero. You re-explain the project. You repeat decisions. You waste tokens on context that should already be there.&lt;/p&gt;

&lt;p&gt;It gets worse when you work in a team:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Your teammate's AI has &lt;strong&gt;zero knowledge&lt;/strong&gt; of what you've built&lt;/li&gt;
&lt;li&gt;Your product specs are in PDF/DOCX — AI &lt;strong&gt;can't read&lt;/strong&gt; binary files&lt;/li&gt;
&lt;li&gt;Requirements are scattered across Slack, docs, and meetings&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;I got tired of this and built &lt;strong&gt;fcontext&lt;/strong&gt;.&lt;/p&gt;

&lt;h2&gt;
  
  
  What is fcontext?
&lt;/h2&gt;

&lt;p&gt;fcontext is an open-source CLI tool that maintains a &lt;code&gt;.fcontext/&lt;/code&gt; directory in your project. Think of it as a &lt;strong&gt;shared brain&lt;/strong&gt; that every AI agent reads at the start of each session.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;pip &lt;span class="nb"&gt;install &lt;/span&gt;fcontext
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;One command to set up:&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="nb"&gt;cd &lt;/span&gt;your-project
fcontext init
fcontext &lt;span class="nb"&gt;enable &lt;/span&gt;copilot   &lt;span class="c"&gt;# or: claude, cursor, trae&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;That's it. Your AI agent now reads project context automatically.&lt;/p&gt;

&lt;h2&gt;
  
  
  How It Works
&lt;/h2&gt;

&lt;p&gt;Here's what lives inside &lt;code&gt;.fcontext/&lt;/code&gt;:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;your-project/
  .fcontext/
    _README.md          # AI-maintained project summary
    _workspace.map      # Auto-generated project structure
    _cache/             # Binary docs converted to Markdown
    _topics/            # Session knowledge &amp;amp; conclusions
    _requirements/      # Stories, tasks, bugs
    _experiences/       # Imported team knowledge (read-only)
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Each AI agent gets instructions in &lt;strong&gt;its native config format&lt;/strong&gt;:&lt;/p&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Agent&lt;/th&gt;
&lt;th&gt;Config Location&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;GitHub Copilot&lt;/td&gt;
&lt;td&gt;&lt;code&gt;.github/instructions/*.instructions.md&lt;/code&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Claude Code&lt;/td&gt;
&lt;td&gt;&lt;code&gt;.claude/rules/*.md&lt;/code&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Cursor&lt;/td&gt;
&lt;td&gt;&lt;code&gt;.cursor/rules/*.md&lt;/code&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Trae&lt;/td&gt;
&lt;td&gt;&lt;code&gt;.trae/rules/*.md&lt;/code&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;The instructions teach the agent to:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;Read &lt;code&gt;_README.md&lt;/code&gt; first to understand the project&lt;/li&gt;
&lt;li&gt;Check &lt;code&gt;_topics/&lt;/code&gt; for prior session conclusions&lt;/li&gt;
&lt;li&gt;Check &lt;code&gt;_cache/&lt;/code&gt; before asking you about binary documents&lt;/li&gt;
&lt;li&gt;Use &lt;code&gt;fcontext req&lt;/code&gt; commands for requirements&lt;/li&gt;
&lt;li&gt;Save important conclusions to &lt;code&gt;_topics/&lt;/code&gt; before the session ends&lt;/li&gt;
&lt;/ol&gt;

&lt;h2&gt;
  
  
  Feature 1: Cross-Session Memory
&lt;/h2&gt;

&lt;p&gt;The biggest win. Your AI agent saves session knowledge to &lt;code&gt;_topics/&lt;/code&gt;, and the next session picks it up:&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;# End of today's session — AI saves conclusions&lt;/span&gt;
&lt;span class="c"&gt;# .fcontext/_topics/auth-debugging.md gets created automatically&lt;/span&gt;

&lt;span class="c"&gt;# Tomorrow, new session:&lt;/span&gt;
&lt;span class="c"&gt;# AI reads _topics/ → knows exactly what happened yesterday&lt;/span&gt;

&lt;span class="c"&gt;# You can also check manually:&lt;/span&gt;
fcontext topic list
fcontext topic show auth-debugging
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;strong&gt;Before fcontext&lt;/strong&gt;: "Can you explain the project?"&lt;br&gt;
&lt;strong&gt;After fcontext&lt;/strong&gt;: "Yesterday we fixed the OAuth redirect. Ready to implement GitHub provider?"&lt;/p&gt;
&lt;h2&gt;
  
  
  Feature 2: Cross-Agent Portability
&lt;/h2&gt;

&lt;p&gt;Switch between agents freely. They all read the same &lt;code&gt;.fcontext/&lt;/code&gt; data:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;fcontext &lt;span class="nb"&gt;enable &lt;/span&gt;copilot
fcontext &lt;span class="nb"&gt;enable &lt;/span&gt;claude
fcontext &lt;span class="nb"&gt;enable &lt;/span&gt;cursor

&lt;span class="c"&gt;# All three agents now share the same context&lt;/span&gt;
&lt;span class="c"&gt;# Use Cursor for frontend, Claude for backend — no context loss&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;No vendor lock-in. The context belongs to &lt;strong&gt;your project&lt;/strong&gt;, not to any agent.&lt;/p&gt;

&lt;h2&gt;
  
  
  Feature 3: Binary Document Indexing
&lt;/h2&gt;

&lt;p&gt;Your product specs are in PDF. Your contracts are in DOCX. Your data is in XLSX. AI agents can't read any of them.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;fcontext index specs/product-requirements.pdf
fcontext index contracts/
fcontext index data/quarterly-report.xlsx
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;fcontext converts them to Markdown and stores them in &lt;code&gt;_cache/&lt;/code&gt;. Now any agent can read your documents.&lt;/p&gt;

&lt;p&gt;Supported formats: PDF, DOCX, XLSX, PPTX, Keynote, EPUB.&lt;/p&gt;

&lt;h2&gt;
  
  
  Feature 4: Requirements Tracking
&lt;/h2&gt;

&lt;p&gt;Stop losing requirements across Slack threads and meeting notes:&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;# Add requirements&lt;/span&gt;
fcontext req add &lt;span class="s2"&gt;"User authentication via OAuth"&lt;/span&gt; &lt;span class="nt"&gt;-t&lt;/span&gt; story
fcontext req add &lt;span class="s2"&gt;"Support Google provider"&lt;/span&gt; &lt;span class="nt"&gt;-t&lt;/span&gt; task &lt;span class="nt"&gt;--parent&lt;/span&gt; STORY-001

&lt;span class="c"&gt;# Track progress&lt;/span&gt;
fcontext req &lt;span class="nb"&gt;set &lt;/span&gt;TASK-001 status &lt;span class="k"&gt;in&lt;/span&gt;&lt;span class="nt"&gt;-progress&lt;/span&gt;
fcontext req &lt;span class="nb"&gt;set &lt;/span&gt;TASK-001 status &lt;span class="k"&gt;done&lt;/span&gt;

&lt;span class="c"&gt;# Visualize&lt;/span&gt;
fcontext req board    &lt;span class="c"&gt;# Kanban view&lt;/span&gt;
fcontext req tree     &lt;span class="c"&gt;# Hierarchy view&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Your AI reads &lt;code&gt;_requirements/&lt;/code&gt; and builds against tracked specs — not hallucinated assumptions.&lt;/p&gt;

&lt;h2&gt;
  
  
  Feature 5: Experience Packs — Team Knowledge Sharing
&lt;/h2&gt;

&lt;p&gt;This is where it gets powerful for teams.&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;# Team lead: export accumulated project knowledge&lt;/span&gt;
fcontext &lt;span class="nb"&gt;export &lt;/span&gt;team-knowledge.zip

&lt;span class="c"&gt;# New team member: import it&lt;/span&gt;
fcontext experience import team-knowledge.zip

&lt;span class="c"&gt;# Their AI instantly knows:&lt;/span&gt;
&lt;span class="c"&gt;# - Project architecture&lt;/span&gt;
&lt;span class="c"&gt;# - Domain concepts&lt;/span&gt;
&lt;span class="c"&gt;# - Coding conventions&lt;/span&gt;
&lt;span class="c"&gt;# - Known pitfalls&lt;/span&gt;
fcontext experience list
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;You can also share via git:&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;# Export to a git repo&lt;/span&gt;
fcontext &lt;span class="nb"&gt;export &lt;/span&gt;git@github.com:team/domain-knowledge.git

&lt;span class="c"&gt;# Import in another project&lt;/span&gt;
fcontext experience import git@github.com:team/domain-knowledge.git

&lt;span class="c"&gt;# Keep it updated&lt;/span&gt;
fcontext experience update
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h2&gt;
  
  
  Real-World Scenario
&lt;/h2&gt;

&lt;p&gt;Here's a typical day with fcontext:&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Morning&lt;/strong&gt; — Open a new Claude session. Claude reads &lt;code&gt;.fcontext/_README.md&lt;/code&gt; and &lt;code&gt;_topics/&lt;/code&gt;. It knows what you did yesterday, what decisions were made, and what's next.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Midday&lt;/strong&gt; — Product manager sends updated specs (PDF). You run &lt;code&gt;fcontext index specs/v2.pdf&lt;/code&gt;. Claude immediately references the new requirements.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Afternoon&lt;/strong&gt; — Switch to Cursor for frontend work. Cursor reads the same &lt;code&gt;.fcontext/&lt;/code&gt; — no re-explaining needed.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;End of day&lt;/strong&gt; — Claude saves today's conclusions to &lt;code&gt;_topics/debugging-payment-flow.md&lt;/code&gt;. Tomorrow's session starts with full context.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Next week&lt;/strong&gt; — New developer joins. They run &lt;code&gt;fcontext experience import team-pack.zip&lt;/code&gt;. Their AI is instantly productive.&lt;/p&gt;

&lt;h2&gt;
  
  
  Technical Details
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Python 3.9+&lt;/strong&gt;, single &lt;code&gt;pip install&lt;/code&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;213 tests&lt;/strong&gt;, CI on Python 3.9/3.12/3.13&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Zero cloud dependency&lt;/strong&gt; — all data in local &lt;code&gt;.fcontext/&lt;/code&gt; directory&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Apache 2.0&lt;/strong&gt; license&lt;/li&gt;
&lt;li&gt;Uses &lt;code&gt;markitdown&lt;/code&gt; for document conversion&lt;/li&gt;
&lt;li&gt;Plain Markdown and CSV files — no proprietary formats&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  Get Started
&lt;/h2&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="c"&gt;# Install&lt;/span&gt;
pip &lt;span class="nb"&gt;install &lt;/span&gt;fcontext

&lt;span class="c"&gt;# Set up in your project&lt;/span&gt;
&lt;span class="nb"&gt;cd &lt;/span&gt;your-project
fcontext init
fcontext &lt;span class="nb"&gt;enable &lt;/span&gt;copilot   &lt;span class="c"&gt;# or: claude, cursor, trae, opencode, openclaw&lt;/span&gt;

&lt;span class="c"&gt;# Index your documents&lt;/span&gt;
fcontext index docs/

&lt;span class="c"&gt;# Start coding — your AI now has persistent context&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;strong&gt;GitHub&lt;/strong&gt;: &lt;a href="https://github.com/lijma/agent-skill-fcontext" rel="noopener noreferrer"&gt;github.com/lijma/agent-skill-fcontext&lt;/a&gt;&lt;br&gt;
&lt;strong&gt;PyPI&lt;/strong&gt;: &lt;a href="https://pypi.org/project/fcontext/" rel="noopener noreferrer"&gt;pypi.org/project/fcontext&lt;/a&gt;&lt;br&gt;
&lt;strong&gt;Docs&lt;/strong&gt;: &lt;a href="https://lijma.github.io/agent-skill-fcontext/" rel="noopener noreferrer"&gt;lijma.github.io/agent-skill-fcontext&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;I'd love to hear your feedback. Have you experienced the "context amnesia" problem? How do you currently handle context across AI sessions?&lt;/p&gt;

&lt;p&gt;Drop a comment or &lt;a href="https://github.com/lijma/agent-skill-fcontext/issues" rel="noopener noreferrer"&gt;open an issue&lt;/a&gt; — I'm actively developing this and every perspective helps.&lt;/p&gt;

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