Apply to my task
arXiv:2610.36523 ★ 93 Oct 27, 2026

Structured Handoff State: Passing a Task to Another Agent as a “Decided / Known / Done / Remaining” List Instead of a Summary or a Chat Tail

Key result

The paradox: a prose summary at handoff turned out worse than just the raw chat tail. The method lets you hand unfinished work to a new model or a fresh session so it doesn’t re-ask, doesn’t redo what’s done, and doesn’t drift back to a rejected option. Before the handoff, break the state into four fields: decided, current facts, done, remaining. In a polished, coherent text the line between “decided,” “tried,” and “done” disappears. A structured block holds that line. At equal text length it beat both the chat tail and the summary.

01

TL;DR

Structured handoff state is a short block with four sections: decisions made, current facts, actions already completed, and remaining work. You write it before handing unfinished work to another model or a fresh session. The researchers compared three ways of passing context at the same text length: the last messages of the conversation, a prose summary, and a structured block. The structured block beat both.

The core pain is that the new model doesn’t know what’s already been decided and done. A chat tail cuts off the beginning, so a user’s choice or an already executed operation falls out of frame. The model asks again, repeats the action, or circles back to a rejected option. The bigger surprise: a prose summary did worse than the raw chat tail. In a polished, coherent narrative, the concrete “what we chose” and “what’s already done” get lost.

The method is simple: before the handoff, explicitly break the state down into fields. Crucially, stale values must be replaced by new ones, not left lying side by side. That’s one extra request or one rule in the agent’s instructions. But the gains are uneven: on one of the six models, some tasks actually got worse.

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

STEP 1 (at the end of the first model's or session's work):
  Build a state block from the history → 4 sections:
  DECISIONS / CURRENT FACTS / DONE / REMAINING

STEP 2 (new model or session):
  Receives the block + its task → continues with the block in mind:
  doesn't reverse decisions, doesn't repeat what's done, doesn't use stale data

Step 1 is a separate request (it can be the same model that did the work). Step 2 is a new chat or session. In the study, the block was built by a separate model, GPT-4.1, from the visible history.

03

Example in Practice

Task: You’ve spent three hours in Claude Code wiring up Stripe payments for a barbershop’s WhatsApp booking bot. The context has ballooned, and it’s time to open a fresh session. If you just copy over the last few messages, the new session won’t know that you dropped polling in favor of webhooks or that the database migration has already been applied.

Prompt (in the old session, before closing it):

I'm handing this work off to a new session that won't see our conversation.
Put together a state handoff block strictly by section:

<Decisions>
Everything we've locked in that can't be revisited without my say-so
(for example: webhooks instead of polling, amounts stored in cents).
</Decisions>

<Current_facts>
Current values. If something changed along the way, give only the
new value; don't mention the old one.
</Current_facts>

<Done>
What's already completed and doesn't need repeating: modified files, applied
migrations, passing and failing tests, failed attempts and why
they didn't work.
</Done>

<Remaining>
What's not done yet, open questions, working hypotheses
(mark them: "hypothesis, unverified").
</Remaining>

Only facts from our work. Don't make anything up.
If a section is empty, write "none".

Result: The model produces a compact four-section block with specifics: file names, migration status, which test is failing. You paste the block as the first message in the new session and write “continue from the Remaining section.” The new session doesn’t re-ask about webhooks and doesn’t try to apply the migration a second time.

04

Why It Works

Weakness: a model handed a truncated history sees only what’s in the window. Decisions and completed actions from the start of the conversation simply don’t exist for it. A prose summary makes things worse: there’s no boundary between “decided,” “tried,” “done,” and “thinking about.” The model reads it all as general background and may mistake a rejected option for the current one.

Strength: models are good at reading explicitly labeled information and following it. If it says “this is locked in” and “this is already done,” the model takes that into account in its next steps. Structure turns implicit state into a set of checkable statements.

How the method exploits this: the four sections separate, by role, what the conversation jumbles together. “Decisions” are constraints, “Done” guards against repeats, “Current facts” guards against stale values, and “Remaining” is the entry point.

Control levers: - Sections: add a section tailored to your work, e.g. <Output_format> for report fields. In the study, for tasks with a file report, the state was built with the required output fields in mind. - The “hypothesis, unverified” tag: removes the risk that the recipient treats a guess as fact. - “Only the new value”: the main lever against stale data. - Length: in the study, the block was no longer than the other variants. Bloat it, and the token-for-token advantage disappears.

05

Prompt Template

The authors’ exact prompt isn’t given in the available part of the paper. The template below is built from their description: “facts, commitments, prior actions, and remaining work.”

We're handing unfinished work to another executor ({model_or_session})
who won't see our conversation. Put together a state block for the task: {task}.

<Decisions>
What's locked in and can't be revisited without explicit consent.
Format: "decision — who made it and when".
</Decisions>

<Current_facts>
Current values of key parameters: {which_parameters}.
If a value changed, give only the latest one. Don't carry over old ones.
</Current_facts>

<Done>
Completed actions that shouldn't be repeated: {what_counts_as_an_action}.
Include failed attempts with the reason.
</Done>

<Remaining>
Unfinished steps and open questions. Mark unconfirmed assumptions
"hypothesis, unverified".
</Remaining>

Rules: use only what's in the history. Don't make things up.
Empty section → "none". Length: no more than {word_count} words.

What to plug in: {task} — the name of the job; {which_parameters} — things that can change (amounts, deadlines, addresses, versions); {what_counts_as_an_action} — operations with consequences (an applied migration, a sent email, an updated shipping address on an order).

🚀 Quick start — paste into the chat:

Here's a template for a state handoff block. Adapt it to my task: {your task}.
Ask me questions to fill in the fields.

[paste the template above]

The LLM will ask which parameters change as you work and which actions are irreversible. That shapes the “Current facts” and “Done” sections, which is exactly where the method protects you from stale data and repeated operations.

06

Limitations

⚠️ Full history is still better: if the whole conversation fits in the window, pass it along. The structured block beats the tail and the summary at equal length, but not the full text.

⚠️ Uneven effect: the gain depends on the model. One of the six actually dipped on average and lost about nine points on tool operations. Test the block on your own recipient model instead of trusting the average.

⚠️ Not a silver bullet: even with a structured block, the recipient fully meets all criteria in only about half of the tasks. When the model was given a reference state, the result rose to 85%. So the main headroom lies in the quality of the block, not just in having one.

⚠️ It won’t recover what was never there: when locating the right files in a codebase, absolute scores stay low. The block helps recall what was seen but doesn’t replace a fresh search.

⚠️ Tested on limited material: the block was built automatically by a single model, and continuation was tested on synthetic scenarios. The comparison with prose was done on one model. The exact block format isn’t shown in the available part of the text.

07

How They Studied It

The idea was to test the handoff itself, not just the final outcome. The authors assembled 1039 tasks of two kinds. The first 300 are real traces of a coding agent working across 38 repositories, cut off after ten steps, where the new model has to find the right files and lines of code. The remaining 739 are synthetic: a conversation where some decisions stay in force and some facts get updated; an order service with operations already executed; a progress report on work with files. Scoring used binary criteria: did the recipient preserve the decision, account for the new fact, avoid repeating what was already done.

Six recipient models (GPT-5.4, Claude Sonnet 5, DeepSeek V3.2, Qwen 3.5 Plus, Gemini 3.5 Flash Lite, Kimi K2) received the same history. The context was passed in three forms at the same token count: the chat tail, a prose summary, and a structured block. This setup rules out “they just got more text.”

Results. Code search: for GPT-5.4, the structured block raised line-F1 from 0.075 to 0.229, and all six models improved. The gain peaks (0.132–0.189) when the needed files have already dropped out of the chat tail. Continuing the work with GPT-5.4: mean score 89.73 (tail), 87.34 (prose), 92.76 (block), 94.51 (full history); full completion of all criteria 44.7 → 42.8 → 52.1 → 57.9%.

What was surprising. First, prose is worse than the raw tail. Second, the leaders differ: Claude and Gemini are best at finding code, while GPT-5.4 is better at continuing the work. Third, the gains didn’t line up across models: of the 300 search tasks, the block helped at least one model in 231, but all six in only 91. In practice, this means you should test your choice of recipient and the block format together.

08

Adaptations and Extrapolations

🔧 Technique: automatic handoff → a HANDOFF.md file via a rule in CLAUDE.md

Instead of remembering to write the block by hand, bake the rule into the agent’s instructions:

When the context is more than 70% full or I write "handoff":
write a block with the sections Decisions / Current_facts /
Done / Remaining to HANDOFF.md. In "Current_facts" keep only the latest
values. At the start of a new session, read HANDOFF.md first.

This is my adaptation: the study tested passing the block, not a rule for writing it to a file.

Extrapolation: checking the recipient’s understanding. In the study, continuation was checked via a state report (what’s decided, what’s done). You can use the same trick in practice: after pasting the block, ask the new session to restate its understanding before it starts working.

Read the state block. Before acting, list in your own words:
1) which decisions can't be changed, 2) what's already done and won't be repeated,
3) what the next step is. Wait for my "yes".

Any mismatch in the restatement immediately shows that the block was put together inaccurately.

09

Resources

  • Benchmarking Task Takeover Across Agent Handoffs (HSC-Bench, Handoff State Continuity Benchmark)
  • Authors: Wenyuan Li, Guang Li, Dongyuan Li, Keisuke Maeda, Takahiro Ogawa, Miki Haseyama — Hokkaido University, The University of Tokyo
  • Related work cited in the paper: ContextBench, CodeTraceBench, LongMemEval, τ-bench, SWE-bench

Research digest

Key result

The paradox: a prose summary at handoff turned out worse than just the raw chat tail. The method lets you hand unfinished work to a new model or a fresh session so it doesn’t re-ask, doesn’t redo what’s done, and doesn’t drift back to a rejected option. Before the handoff, break the state into four fields: decided, current facts, done, remaining. In a polished, coherent text the line between “decided,” “tried,” and “done” disappears. A structured block holds that line. At equal text length it beat both the chat tail and the summary.

Principle

All the work goes into four boxes, and each one has its own job. Decisions are constraints. They can’t be revisited without your say-so. Current facts are fresh values only. Old ones don’t sit next to them. Done guards against repeats. An applied migration, a sent email, a failing test. Remaining is the entry point. What to do next and what’s still just a guess. The new model reads not a story but a set of checkable statements. It’s like a shift handover at a factory. The next shift doesn’t need a monologue about how it all went, just a sheet: what’s set up, what’s broken, what not to touch.

Why it works

A model with a truncated history sees only what fit in the window. Anything decided or done at the beginning simply doesn’t exist for it. So it re-asks and redoes things. Prose doesn’t save the day. Decisions, failed attempts, and guesses blend into one background. The model may mistake a rejected option for the current one. Models follow explicitly labeled information well: say “this is locked in” and the model takes it into account. The study’s numbers show where the main headroom is. When the recipient was given a reference state, the result rose to 85%. With a block assembled by a model, all criteria are met in only about half of the tasks. So it all comes down to the quality of the block. Levers against sloppy blocks: - “Only the new value” — against stale data. - The “hypothesis, unverified” tag — against guesses passed off as facts. - A length cap — bloat the block, and its edge over the tail and the summary vanishes.

When to apply

Long-running work with code or agents → moving to a new session or another model, especially when the context has ballooned and the start of the conversation no longer fits. Also a good fit for tasks where operations have consequences: migrations, sending emails, edits to orders. NOT a fit if the whole conversation fits in the window: the full history is still better. It doesn’t replace a fresh search: when locating the right files in code, scores stayed low. One of the six models in the tests got worse and lost about nine points on tool operations. Test the block on your own recipient model.

Mini recipe

1. Stop before closing the chat: the block is built in the old session, while the history is still visible. 2. Ask for four sections: , , , . Nothing else. 3. Ban fabrication: `Only facts from our work. Don't make anything up. Empty section → "none".` 4. Kill the old values: `If a value changed, give only the latest one. Don't carry over old ones.` 5. Flag the guesses: `Mark anything unconfirmed as "hypothesis, unverified".` 6. Keep it tight: `Length: no more than 300 words.` Plug in your own limit. 7. Read the block yourself: one wrong line in “Done” and the new session will repeat or skip an operation. 8. Paste the block as the first message: add `Continue from the "Remaining" section`. 9. Add your own fields when needed: for example , if report fields matter.

Examples

[BAD]: `Paste the last 20 messages from the old chat here and keep going` The start of the conversation is cut off. The new session doesn’t know about the webhooks and will apply the migration all over again. [BAD]: `Briefly summarize what we did` You get smooth prose. Decisions, failures, and guesses become indistinguishable. [GOOD]: `I'm handing this work off to a new session that won't see our conversation. Put together a block strictly by section. : what's locked in and can't be revisited without my say-so (for example, webhooks instead of polling, amounts stored in cents). : current values only, don't mention old ones. : modified files, applied migrations, failing tests, failed attempts and why they didn't work. : open questions and guesses, marked "hypothesis, unverified". Only facts from the work, don't make anything up. Empty section → "none".` The new session gets specifics: file names, migration status, which test is failing. Webhooks aren’t up for debate again, and the migration doesn’t get applied twice.

In plain words

When your context balloons and you hand a task off to a new session or another agent, the model instantly loses the thread. Models aren’t telepathic: feed them the tail of the chat or a loose retelling, and you get a hallucination circus. The researchers proved it: the structured handoff state method smashes both the raw chat and the prose summary to pieces at a strictly identical token budget.

It’s like handing a construction site over to a new foreman with a mumbled “So, uh, we were digging something over there, there was cement, Mike wanted to go deeper”. The new guy ends up pouring concrete right where the crew decided to stop digging half an hour ago. For an LLM, a wall of prose is mush with no boundaries, where a rejected half-baked hypothesis blends into the same background as what’s already done in the code.

To keep the agent from freelancing, the handoff gets packed into four strict blocks: decisions made, current facts, completed actions, and remaining work. No fluff: the model has to see clearly that webhooks got approved and polling got tossed in the trash. With this approach, the new session doesn’t mix up archived ideas with the current plan, and task pickup quality jumps dramatically without bloating the context.

The mechanics were tested on agents, but the principle is universal. It’s a must for any long session in Claude Code, agents in Cursor, or custom LangChain pipelines. Anywhere the context swells and needs a reset, a wall of text guarantees bugs, while a structured snapshot instantly puts the fresh model back on the right track.

Bottom line: stop feeding the model “previously on…” recaps or hoping the last five messages will do. Want a seamless handoff of a heavy task? Lock in 4 concrete sections before every session reset. Otherwise you’ll spend hours chasing the dumbest bugs imaginable while everyone else closes tasks in two clicks.

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 Structured Handoff State: Passing a Task to Another Agent as a “Decided / Known / Done / Remaining” List Instead of a Summary or a Chat Tail arXiv:2610.36523

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