DEV Community

Taylor Wang
Taylor Wang

Posted on

48 Hours of Field Notes: The Free Model Forgot Yesterday's Bug, So I Built a Memory Contract

Somewhere in every developer's week there is a moment when an AI assistant gives excellent advice. We close the terminal, come back after lunch, and the same assistant asks for context we already supplied with bullet points and a screenshot.

I spent 48 hours testing how much of that context survives across session boundaries. My tools were MonkeyCode's free-model access and the free server option. Disclosure: This article was prepared as part of MonkeyCode's product outreach. The lesson is general, though: chat conversations are processes, and processes die when you close the tab.

What I tried

I took one reproducible debugging story and ran it in three configurations.

  1. One long conversation. I kept every new observation in the same chat, pasted new errors on top of old ones, and asked for advice after each change.
  2. Same bug, new session. I closed the conversation after each failing attempt. Then I opened a fresh one, pasted a condensed problem statement, and asked for the next step.
  3. A memory file. I wrote a state slice into a local Markdown file before each session and asked the model to read that file before answering.

The first configuration acted like a junior pair engineer who keeps an open notebook. The second one forgot my most important constraint and re-suggested the fix I had already rejected. The third one worked only when I actually pasted the whole file back into the prompt by hand.

What broke

The breaking point was not a rate limit, a timeout, or a server restart. It was the silent assumption that the model remembers what I showed it earlier. A context window is a short-term staging area, not a database. When the session ends, the thread contents stop existing from the model's point of view.

That mistake cost me time twice. I believed my written conclusions were enough, so I opened a fresh session with a two-line summary. The model then generated a path that contradicted the previous session's findings. My notes were accurate; the model simply never received them.

I also learned that a fresh session is not a continuation. It is a new process with the same assistant name. The only thing crossing the boundary was the state I copied manually.

Three signals that you are fighting session amnesia

  • The model restates a rejected fix with fresh confidence.
  • It asks for a stack trace that lived in yesterday's thread.
  • It agrees with a small snippet but contradicts your full field notes.

If you see one of those, the fix is not a longer prompt. It is an explicit context reload.

A memory contract test

The only part of those 48 hours I would repeat is a small harness that proves whether a fact can cross a session boundary. It does not measure accuracy or intelligence. It measures the minimum thing: does a single pinned fact appear when I ask for it in the same session, and does it appear in a fresh session?

# context_memory_check.py
import json
import os
import urllib.request

ENDPOINT = os.getenv('LLM_ENDPOINT')
MODEL = os.getenv('LLM_MODEL')
API_KEY = os.getenv('LLM_API_KEY')

def ask(messages):
    payload = json.dumps({'model': MODEL, 'messages': messages}).encode()
    req = urllib.request.Request(
        ENDPOINT,
        data=payload,
        headers={
            'Content-Type': 'application/json',
            'Authorization': 'Bearer ' + API_KEY,
        },
    )
    with urllib.request.urlopen(req) as resp:
        data = json.loads(resp.read().decode())
    return data['choices'][0]['message']['content']

PIN = 'pineapple-ridge-7041'

same_session = [
    {'role': 'user', 'content': 'PIN: ' + PIN + '. Remember this exactly.'},
    {'role': 'assistant', 'content': 'Got it.'},
    {'role': 'user', 'content': 'What was the PIN?'},
]

fresh_session = [{'role': 'user', 'content': 'What was the PIN?'}]

print('same session:', ask(same_session)[:120])
print('fresh session:', ask(fresh_session)[:120])
Enter fullscreen mode Exit fullscreen mode

Run it with your own endpoint variables. I ran this small check before and after the test period. The same-session call returned the PIN; the fresh-session call did not, because no stored state existed to retrieve. Do not treat those words as a benchmark—the sample is tiny and the point is the workflow, not the number.

Why this matters now

The popular framing that your AI remembers everything conflates two separate things. A model can make use of a context window that you fill. It cannot keep that context between requests unless your tool re-sends it. If your debugging flow treats each chat as a continuation, you are debugging with a memory leak.

The same applies when you switch from a paid tier to a free model on a free server. The availability is real, and so is the statelessness. Cheap compute does not give the model a persistent brain.

What I would repeat

  • Build a state-slice habit. Write the current truth as facts: stack trace, last change, failed fix, accepted constraint.
  • Paste the full state slice into each new prompt. A condensed summary is not enough when the model starts from zero.
  • Keep long-running investigations inside one session when possible. Splitting sessions saves tokens but moves the context-loading burden to me.
  • Run a tiny memory contract test before trusting any new provider or tier. It takes five minutes and tells you which part of the stack owns memory.

A small decision table

Symptom Likely cause Move
Model restates a rejected fix Session boundary erased findings Paste the full state slice
Model asks for the trace again Missing context in the prompt Verify the trace is actually in the message
Model contradicts your notes Summary was too compressed Reload the whole memory file

Who should skip this approach

This workflow is not a product review and it is not a benchmark. If you need an audit trail of exactly which context went into a model, keep that context in version control before you paste it. If your incident involves sensitive customer logs, keep those logs out of cloud-hosted chat endpoints entirely. A free server option is great for exploration; it is not your production memory layer.

A debugging partner with perfect recall is a luxury. Dependable engineering means writing down where context lives, reloading it explicitly, and testing that reload. The free model did its part; the missing memory was mine all along.

If your assistant keeps forgetting yesterday's bug, try the five-minute memory contract and tell me what you find. I suspect the next field note will be about the different ways statelessness hides inside a single session.

Top comments (0)