TL;DR
If you're in a long conversation with an AI and you first asked it to do something, then later said "never mind, stop doing that" — the model often just... keeps doing it. Sometimes it even writes "removed, as you asked" and breaks that promise in the very same breath. Researchers call this behavioral relapse — a canceled requirement quietly creeping back — and they figured out a fix: instead of just saying "cancel X," you rebuild a full, clean list of what's currently active every time, rather than trusting the model to compute the diff from chat history on its own.
The problem gets worse as the number of requirements in the conversation grows. On a mid-tier model, relapse jumps from nearly zero to 40% as the number of active rules in the thread increases. The reason is simple: the model doesn't keep a clean "current status" for each rule in its head — it reads the entire chat history as one continuous stream of text, and the old instruction "do X" physically sits right next to the new one "don't do X," rather than overwriting it.
The fix is to compile ahead of time: before the next step, assemble a single fresh list of currently active rules — with no mention of canceled ones — and hand that to the model as the new baseline, instead of relying on it to track the edits as the conversation unfolds. Even a bare-bones version — one line saying "requirement X is no longer in effect" — removes roughly a third of the problem.
Want this for your own case? Apply this study to your task: AI adapts its method to what you are working on and writes the prompt.
Method Blueprint
STEP 1: Log every requirement as a distinct item (don't let it dissolve into general prose)
STEP 2: When you cancel something — explicitly mark it as canceled, don't just drop it from the next message
STEP 3: Before an important step (generating final text/code) — rebuild ONE consolidated block:
only the active requirements + an explicit list of what's been canceled
STEP 4: Hand the model this fresh block as the new baseline, instead of relying on chat-history memory
All steps happen within a single conversation — just as separate messages. No API needed.
Example in Action
The task: You've been chatting with ChatGPT for a week, using it to draft replies to your online store's customer support tickets. At the start, you asked: "Always sign off with 'Best regards, the Support Team.'" Fifteen messages and several other tweaks later, you say: "Stop adding that signature, it's unnecessary." A few messages after that, the signature quietly reappears — sometimes right under a line that says "removed the signature, as you asked."
Prompt (for rebuilding state):
Here is the complete list of what should currently be followed when replying to customer inquiries.
Use ONLY this list. Anything said earlier in this conversation that isn't repeated here
should be treated as no longer in effect, even if I mentioned it before.
Task: {customer support replies for an online store}
Active requirements:
1. Address the customer formally ("you," polite register)
2. Keep the reply under 5 sentences
3. Include a link to order status at the end, if the customer asked about shipping
Canceled (do NOT do this, even if I asked for it earlier):
- Signature "Best regards, the Support Team" — no longer add this
From now on, work strictly from this list.
Result: The model stops automatically bringing back the signature in future replies, because it no longer has an "old instruction + new instruction" tangle to sort through — it has one clean, current list. If you just write a short version — "Important: no signature needed anymore, don't add it" — the effect will be weaker, but noticeably better than nothing.
Why This Works
The model doesn't store rules as separate records with an "active/canceled" flag — it sees the whole conversation as one long piece of text. Your old instruction "do X" is still physically sitting in context, and the new instruction "don't do X" reads to the model as just another chunk of text nearby — not a command to "delete the previous line." The more rules pile up over the course of a conversation, the harder it is for the model to figure out which one applies right now — and the more often it slides back into old behavior.
What the model IS great at is following requirements handed to it fresh, explicit, and in one clean block — with nothing to compute from history. That's exactly why compile-ahead-of-time works: instead of asking the model to "subtract" the canceled stuff from accumulated history, you (or your prompt) hand it the already-computed answer — just what matters right now.
Levers you can pull: - The longer and more complex the conversation, the more often you should rebuild the list — relapse risk tracks the number of accumulated requirements, not time itself. - An explicit "canceled" section works better than silently dropping an item from the list — the model needs to see the "before → after" contrast, not guess at it. - A single reminder line ("X is no longer in effect") is the cheap option if rebuilding the whole list every time feels like too much work; it gets you roughly a third of the benefit of a full rebuild.
Prompt Template
Here is the complete, current list of requirements for this task. Use ONLY this list.
Anything said earlier in this conversation that isn't repeated here no longer applies,
even if I asked for it before.
Task: {task description}
Active requirements:
1. {requirement}
2. {requirement}
3. {requirement}
Canceled (do NOT do this, even if I asked for it earlier):
- {canceled requirement}
From now on, work strictly from this list.
What to fill in: {task description} — the gist of what you're working on (text, code, a plan, an email). Under "active requirements" — what genuinely needs to hold right now. Under "canceled" — specifically what you asked for before and have since changed your mind about.
🚀 Quick start — paste into chat:
Here's a requirement-rebuilding template for a long conversation. Adapt it to my task: {your task}.
Ask me questions to fill in the fields.
[paste template above]
The LLM will ask you which requirements are currently active and which are canceled — because it's exactly that clear "active / canceled" split that removes the ambiguity causing the relapse.
Limitations
⚠️ The effect isn't uniform: it's most pronounced on mid-tier models. More powerful models barely suffer from relapse to begin with, so rebuilding the list gives them less of a boost.
⚠️ Formatting-breakdown risk: when you hand the model a large rebuilt instruction block, in some cases (up to 10%, per the study) it can break the response's formatting or structure. Check your output.
⚠️ Validated on tasks with clear-cut criteria (code): for creative or subjective tasks (writing style, tone), the effect may be weaker — it's harder to objectively verify whether a canceled requirement "came back."
⚠️ A simple reminder line is weaker than a full rebuild: if you just say "stop doing X" without explicitly rebuilding the whole list, there's still an effect, but it's noticeably smaller.
Resources
ReBIND (Rebinding Diagnostics for Black-box LLMs) — Haoyuan Zhu, University of Sheffield. The RELAPSE-Code benchmark is built on 67 HumanEval tasks with 201 verified checkers. Paper: "Dead text or binding clause? Measuring and restoring constraint influence in black-box LLM dialogues."