Apply to my task
arXiv:2607.01855 ★ 80 Jul 2, 2026

Verification Gate: how to stop LLMs from silently breaking your earlier requirements in long conversations

Key result

The model doesn't forget your earlier requirements — it just stops relying on them. Old constraints are still sitting in the chat history, but their weight in generation drops with every new message. This is regression accumulation: ask it to "add some emotion" — the length limit disappears; ask it to "make it stricter" — the tone you set two turns ago vanishes. Verification Gate lets you iteratively refine a text, plan, or structure — without silently losing the constraints you set at the start. Before every change, the model is given an explicit list of all active requirements and a hard exit condition: "output the result only if every item is ✅". It no longer has to keep track of how important old rules are "in its head" — it re-reads them every single time. Silent compromises turn into explicit conflicts — and you see them before the final text, instead of discovering a lost tone three edits later.

01

TL;DR

When you iteratively refine something with an LLM — text, a plan, a structure — the model zeroes in on the new request and quietly breaks whatever you set up earlier. You asked for "add more emotion" — and the length limit vanished. You asked for "make it stricter" — and the tone from turn two disappeared. This is called regression accumulation: regression that piles up conversation after conversation.

LLMs are built so that the latest request weighs more than the accumulated context. The model doesn't "remember" how important the old constraints are — it optimizes for the newest requirement, sacrificing the previous ones. Not because it forgot, but because it never sees a signal that the old rules are still mandatory.

Verification Gate is an explicit instruction before every edit: list all active requirements, apply the new one, check that all the old ones still hold. If there's a conflict, report it — don't quietly "fix" it. This flips the model from "just do the latest thing" mode into "do the new thing while preserving everything before it" mode.

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.

02

Method Blueprint

(All steps go in a single message. Repeat before every edit.)

STEP 0: List all active requirements → explicit list
STEP 1: Apply the requested change → draft
STEP 2: Check each requirement from the list → status: ✅ / ❌
STEP 3a: If everything's OK → output the final result
STEP 3b: If there's a conflict → name the specific conflict, propose
         a compatible version or explicitly state that it can't be reconciled
03

Example in Action

Task: You're writing a price-increase letter to a client — iteratively, over several passes. You set early requirements: no more than 7 sentences, no apologies, business tone, keep the partnership vibe. After the 4th round of edits, the letter sprawled to 15 sentences, "we understand this is inconvenient" crept in, and the business tone vanished.

Prompt with Verification Gate (before every edit):

List of active text requirements:
1. No more than 7 sentences
2. No apologies or justifications
3. Business-like, direct tone
4. Keep a partnership tone, not a directive one
5. Justify through value, not through costs

New requirement: {new_requirement}

Current version of the text:
{current_text}

Instructions:
1. Apply the new requirement
2. Check: is every item in the list above satisfied? Give a status ✅/❌
3. If there's a ❌ — name the conflict explicitly and propose a version without it
4. If the conflict is unresolvable — say so, don't silently sacrifice
   old requirements
5. Output the final text only if every item is ✅

Result: The model shows an explicit check against every item before the final text. If the new requirement conflicts with an old one (say, "add emotion" vs. "business tone") — that will be visible directly, instead of quietly showing up as a lost tone in the text.

04

Why It Works

LLM weakness: The model doesn't store "priorities" — it generates text based on the nearest context. The most recent message statistically outweighs something written 5-6 messages ago. Early constraints don't disappear from the history, but their weight in generation drops.

LLM strength: The model handles explicit lists and "match/mismatch" checks well, as long as the condition is stated directly. It's good at comparing — but only if you give it something to compare against.

How Verification Gate leverages this: We turn the implicit "remember everything" into an explicit checklist before every step. The model doesn't "remember" the importance of old requirements — it re-reads them. On top of that, we add an explicit exit condition: "only if everything is ✅." This removes silent trade-offs.

Control levers:

  • Checklist granularity → more items = tighter control, but more tokens
  • "Report the conflict" instruction → without it, the model will quietly compromise
  • The phrase "don't silently sacrifice old requirements" → critical: without it, the model often tries to "satisfy both" by blurring both
  • "Output the final text only if everything is ✅" → a hard exit condition; drop it if you want to see drafts even when there's a conflict
05

Prompt Template

List of active requirements:
{requirement_1}
{requirement_2}
{requirement_3}
[add as many as needed]

New requirement: {new_requirement}

Current version:
{current_content}

Workflow:
1. Apply {new_requirement} to the current version
2. Check each item in the list: status ✅ met / ❌ violated
3. If there's a ❌ — name the specific conflict and propose a version without it
4. If the conflict is unresolvable — say so explicitly, don't sacrifice
   old requirements for the new one
5. Output the final result only if everything is ✅

Placeholders: - {requirement_X} — specific constraints from earlier rounds: tone, length, structure, restrictions - {new_requirement} — what you're asking to change right now - {current_content} — the current version of the text/plan/structure


🚀 Quick Start — paste into the chat:

Here's a Verification Gate template — it helps avoid losing early
requirements during iterative edits. Adapt it to my task: {your_task}.
Ask me questions to fill in the fields.

[paste the template above]

The LLM will ask what requirements are already set and what needs to change right now — because without that info it can't build the checklist and the verification loop.

06

Limitations

⚠️ First turn: You don't need this method on the very first message — regression only kicks in from the second one on. Start using it from the first edit.

⚠️ Subjective requirements: If constraints are fuzzy ("keep it feeling light"), the model might mark ✅ where you'd see a ❌. The more concretely you phrase requirements, the more precisely the method works.

⚠️ The method reduces regression, but doesn't eliminate it: Even with explicit verification, some conflicts remain. Strict control on complex tasks may require an explicit "roll back to the previous version and try a different approach."

⚠️ Token growth: Every round now includes a list of all requirements plus statuses. In long conversations, context grows faster. To save tokens, you can move the requirements list into the system prompt.

07

How It Was Studied

The idea was simple: build evolution tasks with explicit requirement accumulation — so that every next step depends on all the previous ones — and check not "did the last step get done correctly" but "did everything that came before survive."

The researchers took 542 programming tasks and built an 8-step chain of changes for each one: first a basic implementation, then error handling, input generalization, caching, a new feature, refactoring into a class, adding logging, and algorithm optimization. At every step, the model wasn't just supposed to fulfill the new requirement — it had to preserve everything before it. That's the key difference from typical benchmarks: the final version was checked against every test from step one, not just the most recent ones.

They tested six models — GPT-4o, DeepSeek-V3, Qwen2.5-Coder-32B, Qwen3-32B, DS-R1-Distill-32B, and Llama-3.1-8B — across 26,016 instances (542 tasks × 6 models × 8 steps). The result turned out to be surprisingly harsh: between 40% and 73% of tasks lost at least one previously working requirement by the end of the conversation. Every single model, no exceptions.

The most unexpected pattern: regression showed up strongest at the steps that added error handling and input type expansion — tasks that intuitively feel "isolated." In reality, they interact deeply with the preceding logic. The researchers also manually reviewed 384 failure cases and found that the main cause wasn't lost context, but conflicts between new instructions and old requirements. The model didn't "forget" — it just prioritized in a way that didn't favor you. Of all the strategies tested, only Verification Gate (checking new code against earlier tests + rolling back when needed) consistently improved every model: DeepSeek-V3's final quality jumped from 75.8% to 87.9%, and Llama-3.1-8B's went from 31.6% to 47.3%.

08

Adaptations and Extrapolations

1. Adaptation: Verification Gate for Non-Technical Tasks

The original was built for code, but the mechanism is universal. Any iterative chat work — documents, strategies, structures — suffers from the exact same problem.

💡 For multi-turn work with documents and strategies:

Add the requirements list to the system prompt or to the top of every new chat. This makes the requirements a "permanent part of the context" instead of messages that fade away.

[System prompt / start of chat]

We're working on {document_type}. Active, non-negotiable requirements:
1. {requirement_1}
2. {requirement_2}
...

For every change — first list the requirements, then make the change, then verify.
Conflict → report it explicitly, don't silently sacrifice old requirements.

2. Technique: "Requirements Snapshot" Every 3-4 Turns

🔧 Accumulated requirements → an explicit recap mid-conversation

Every 3-4 rounds of edits, ask the model to take a "snapshot" of the currently active requirements:

Before we continue, write out the full, up-to-date list of
requirements for {document} — everything we've established in this conversation.
Number them.

This list then gets plugged into the Verification Gate. It's useful in long sessions where requirements were added gradually and never got collected in one place.


3. Extrapolation: Verification Gate + Chain of Thought (CoT)

If you want to see why the model decided a requirement was met, add an explicit reasoning output before the final text:

After checking each requirement, explain in 1-2 words
why you marked it ✅ or ❌. Then output the final result.

This helps catch "false ✅s" — cases where the model decided a requirement was met, but you'd disagree.

09

Resources

Paper title: Regression Accumulation in Multi-Turn LLM Programming Conversations (ASE '26, 2026)

Authors: Yonghui (Andie) Huang, Lin Ma, Amjed Tahir, Qian Zhang, Liwen Xiao, Lysa Xiao

Organizations: Massey University (New Zealand), University of Otago (New Zealand), Alibaba Research Center for Complexity Sciences / Hangzhou Normal University (China)

Replication package: https://anonymous.4open.science/r/multi-turn-llm-regression-E73E

Benchmarks: HumanEval+, MBPP+ (EvalPlus)

Research digest

Key result

The model doesn't forget your earlier requirements — it just stops relying on them. Old constraints are still sitting in the chat history, but their weight in generation drops with every new message. This is regression accumulation: ask it to "add some emotion" — the length limit disappears; ask it to "make it stricter" — the tone you set two turns ago vanishes. Verification Gate lets you iteratively refine a text, plan, or structure — without silently losing the constraints you set at the start. Before every change, the model is given an explicit list of all active requirements and a hard exit condition: "output the result only if every item is ✅". It no longer has to keep track of how important old rules are "in its head" — it re-reads them every single time. Silent compromises turn into explicit conflicts — and you see them before the final text, instead of discovering a lost tone three edits later.

Principle

Without the method, it works like this: the model gets "make it stricter" and does exactly that. Everything else fades into the background. Earlier constraints statistically lose out to the most recent request. With Verification Gate, the order is different. Before the change: a full list of active requirements. After the change: a status for each item — satisfied or violated. Exit condition: the final text is produced only if every item checks out. The phrase "don't silently sacrifice old requirements" in the prompt is critical. Without it, the model chooses a compromise: it tries to satisfy both the old and the new requirement — and blurs both. With it, the model names the conflict explicitly and offers a version without it. That's the difference between "the text seems fine" and "I know exactly where the problem is."

Why it works

LLMs are good at comparison. They're bad at prioritizing without an explicit instruction. They can check compliance against a list — but only if that list is right in front of them, right now. The problem isn't memory. Earlier requirements never disappear from the history. They lose weight: the most recent message statistically outweighs something written 5–6 turns ago. By re-reading the list before every step, we artificially restore that weight. The hard exit condition — "only if everything checks out" — eliminates silent sacrifice of requirements. Without it, the model will output a text no matter what — and you'll never know exactly what got sacrificed.

When to apply

Iterative editing of texts, plans, or structures — especially once you're three or more edits in, and the early constraints still matter: client emails with strict tone and length rules, marketing copy with banned phrases, technical specs, document structures. Not needed on the first turn — regression accumulation only kicks in from the second request onward. On single-step tasks, the method is overkill.

Mini recipe

1. Compile the list: write out every constraint from previous turns — tone, length, banned items, structural rules. The more concrete, the more precisely it works. Not "keep the light feel," but "no more than 7 sentences, no passive voice." 2. State the new requirement: as a single, concrete point. "Add examples. Make the tone warmer. Shorten the second paragraph." 3. Give a verification instruction: check every item on the list — satisfied or violated. If violated, name the specific conflict and propose a version without it. Only output the final result if every item is satisfied. 4. Add protection against silent compromises: the phrase "don't silently sacrifice old requirements for the new one" — without it, the model will try to satisfy everything at once, blurring both requirements simultaneously.

Examples

[BAD]: `This email is too cold — add some warmth and emotion` The model will add warmth — and quietly balloon to 15 sentences, throw in "we understand your concern," and lose the businesslike tone. Everything looks fine until you compare it against the actual requirements. [GOOD]: `Active requirements for this email: 1. No more than 7 sentences 2. No apologies or excuses 3. Direct, businesslike tone 4. Justify through value, not through cost savings New requirement: add warmth to the closing Current version: [text] Workflow: 1. Apply the new requirement 2. Check each item: satisfied / violated 3. If violated — name the conflict and propose a version without it 4. Don't silently sacrifice old requirements for the new one 5. Output the final text only if every item is satisfied` Result: the model shows the status of every item before delivering the final text. If "warmth" conflicts with "businesslike tone" — you see it explicitly and decide what matters more, instead of later wondering where "we sincerely apologize" came from.

In plain words

AI assistants don't work like a safe where you lock in rules — they work like a leaky bucket: the more new edits you pour in, the faster the old ones drain out. The core of the regression accumulation problem is that a model physically can't hold onto priorities over a long stretch. When you ask an LLM to fix one detail, it rewrites the entire block of text from scratch, tuned to your very latest whim. At that moment, the old instructions — that "keep it under 100 words" or "no corporate tone" you set earlier — turn into background noise that the model happily tunes out in favor of the fresh task at hand.

It's like working with an incredibly diligent but phenomenally forgetful intern. You ask them to make coffee with no sugar, then to add cinnamon, then to serve it in a big mug. What you get back is a giant mug of coffee with cinnamon — but loaded with three spoonfuls of sugar, because your last instruction didn't mention sugar at all. They're not trying to annoy you; they just live in the moment: the most recent edit outweighs everything said five minutes ago.

This failure mode is baked right into the architecture: the model generates its response based on the statistical weight of words in the context. The further back your original requirement sits in the conversation history, the weaker its pull on the current output. Researchers found that regression builds up iteratively: on step two, one small thing breaks; by step five, the text has flipped into the complete opposite of where you started. Instead of a polished result, you end up with a Frankenstein's monster — technically compliant with the latest request, but with every prior win buried underneath.

Even though the experiments focused on coding, this principle is a universal curse of prompting in general. Whether you're writing a script, an article, or a client email, the rule holds: the longer the chat, the higher the odds the model "drifts." This applies to ChatGPT, Claude, and every other LLM out there, because none of them are wired to understand a hierarchy of meaning. If you don't actively manage the process, by the tenth edit your text will be about as useful as a microwave manual written in a language you can't read.

The big takeaway: forget about long chains of one-off tweaks. To avoid piling up errors, use the full-reset method: instead of just tossing in a new edit, copy all the critical constraints into every message, or lock them into a system prompt. Leave the iterations to run on autopilot, and you'll get a compounding-mess effect, where every new improvement breaks two old ones. Either you keep the model on a tight leash, or it turns your project into an incoherent mess.

AI lab assistant

Apply this study to your task

Describe what you're working on. AI takes the method and the measured results from this paper and adapts them to your case, or writes a ready prompt built on them.

Based on Verification Gate: how to stop LLMs from silently breaking your earlier requirements in long conversations arXiv:2607.01855

Sign in to apply this study New accounts get 50 free credits.