3行でいうと
- 「途中保存」は1種類ではありません。会話の中身(要約して持ち越す)、ファイルの状態(編集前に戻す)、実行の状態(止まった地点から再開する)は、別々の仕組みで、別々の限界があります。
- Anthropicのエンジニアリング記事は、長い作業を「最初の設定役」と「1回に1機能だけ進める作業役」に分け、進捗ファイル、Gitのコミット、機能リストのJSONで引き継ぐ設計を書いています。
- 公式文書は、戻せない範囲もはっきり書いています。たとえばClaude Codeのチェックポイントは、Bashコマンドによる変更を追跡しません。LangGraphは、巻き戻した地点より後のノードをもう一度実行するので、外部への書き込みは二重に起きうる点に注意が要ります。
この記事では、まだエージェントを組んで確かめていません。この記事は、公式の文書とエンジニアリング記事を読んでまとめたものです。数字と仕様は2026年10月22日に確認しました。製品の仕様は変わることがあります。
先に結論
- 長い仕事で壊れやすいのは「前回の続き」です。公式の記事によると、新しいセッションは前の記憶を持たずに始まり、引き継ぎメモなしに交代する現場のようなものだ、と書かれています。
- だから設計の中心は、次の担当がファイルとGitの履歴だけで状況をつかめる状態を、毎回の終わりに作ることです。会話の要約(圧縮)だけでは足りなかった、という経験も書かれています。
- 途中保存の道具は、守る対象が違います。会話の要約はファイルを戻せず、ファイルの巻き戻しは会話を戻せません。実行状態の保存(LangGraph)は、再開のときに副作用を二重に起こしうるので、設計の側で備えます。ここは僕らの整理です。
前提:何が「失われる」のか
エージェント(AIが道具を使って手順を自分で進める仕組み)は、作業の途中で「文脈」を使い切ります。文脈とは、AIが一度に読める量(コンテキストウィンドウ)に収まっている、これまでのやりとりです。
Anthropicのエンジニアリング記事(2025年11月26日公開)は、失敗のパターンを2つ挙げています。
- 一気に全部やろうとする。 途中で文脈が尽き、中途半端で説明も残らない状態になります。次のセッションは、何が起きたかを推測して直すことになります。
- 早すぎる完了宣言。 後半で、新しいエージェントが既にある進捗を見て「もう終わった」と判断します。
この記事は、圧縮の機能があることを認めたうえで、それだけでは足りなかったと書いています。Opus 4.5に、「claude.aiのようなアプリを作れ」という高い水準の指示だけを与えてループさせても、製品として使える水準には届かなかった、という実験です。
途中保存の3つの層
公式資料を読むと、「途中保存」と呼ばれるものは、守る対象によって3つに分かれます。
| 層 | 守るもの | 公式資料に出てくる例 | 戻せないもの |
|---|---|---|---|
| 会話 | AIが覚えている内容 | 圧縮(compaction)、メモ(NOTES.mdやメモリツール) | ディスク上のファイル |
| ファイル | ディスク上の編集結果 | Claude Codeの/rewind、Agent SDKのrewind_files()、Git |
会話(SDKの場合)、Bashでの変更 |
| 実行状態 | 処理の途中の状態 | LangGraphのチェックポイント | 外部に出した副作用 |
会話の層:圧縮、メモ、サブエージェント
Anthropicの「Effective context engineering」の記事(2025年9月29日公開、ページのメタデータでは2026年10月18日に更新)は、長い作業のための技法を3つ挙げています。
- 圧縮(compaction)。 上限に近づいた会話を要約して、新しい窓で続けます。Claude Codeの例では、設計上の決定、未解決のバグ、実装の詳細を残し、重複した道具の出力を捨てます。そのうえで、直近に開いた5つのファイルを添えて続きます。要約の調整は、まず取りこぼしを減らし、そのあと余計なものを削る、と二段で行うよう書かれています。
- 構造化されたメモ。 文脈の外のファイルに、エージェント自身が書き出し、あとで読み直します。NOTES.mdが例です。記事は、あるゲームの例を挙げています。
- サブエージェント。 全体の計画を持つ担当と、きれいな文脈で個別の仕事をする担当に分けます。個別の担当が返すのは、1,000〜2,000トークンほどの要約が多い、と書かれています。
使い分けとして、記事は、やりとりの多い作業には圧縮、節目のはっきりした開発にはメモ、並列に調べる研究にはサブエージェントが向く、としています。また「いちばん単純なもので足りるならそれを使う」という趣旨の助言で締めています。
AnthropicのAPIにも、圧縮の機能があります。サーバー側で、古いやりとりを要約に置きかえます。概要のページは、「必要になったときに自分で頼む方式」と「入力トークンが一定量に達したら自動で行う方式」の2つがある、と書いています。概要のページは、使える場面では「必要になったときに自分で頼む方式」を使うよう勧めています。下の「くわしく」にまとめた細かい数字は、自動で行う方式のものです。
圧縮(トークン到達で自動)の公式の数字と注意
Anthropicの「Compaction at a token threshold」のページによると、次の通りです(2026年10月22日に確認)。
| 項目 | 内容 |
|---|---|
| ベータのヘッダー/方式 | compact-2026-01-12/compact_20260112(context_management.editsに入れる) |
| 発動の条件 | trigger。種類はinput_tokensのみ。初期値150,000、下限50,000 |
pause_after_compaction |
初期値false。trueだと要約だけ返してstop_reason: "compaction"で止まる |
instructions |
要約の依頼文。初期の依頼文を「置きかえる」(追加ではない) |
| 続け方 | 応答の中身を、そのままアシスタントの発言としてmessagesに足す。次の要求では、compactionブロックより前が捨てられる |
| 料金の数え方 | 上位のinput_tokensとoutput_tokensに圧縮の分は入らない。合計はusage.iterationsを足す |
注意が2つあります。要約には、その要求と同じモデルが使われ、安いモデルは選べません。また、道具が定義されていると、要約の代わりに道具を呼ぶことがあり、その場合compactionブロックのcontentがnullになります。
概要のページには、「必要なときに自分で頼む」方式のヘッダーとしてcompact-2026-09-04が書かれていました。方式でヘッダーが違うので、使う前に各ページで確かめてください。この記事は、実際に使って確かめた記録ではありません。
ファイルの層:Gitとチェックポイント
Anthropicの設計記事で、いちばん具体的なのがこの層です。作業を、同じ土台(同じシステム用の文と道具)の上で、最初に与える依頼だけ違う2つの役割に分けています。
最初の設定役(初回のセッションだけ) が作るのは、次の4つです。
- 開発用サーバーを起動する
init.sh。 - 進捗の記録
claude-progress.txt。 - 最初のGitのコミット。
- 機能リスト(JSON)。
作業役(それ以降の毎回) は、1回に1つの機能だけを進めます。これが、先に挙げた「一気にやろうとする」失敗への対策にあたります(僕らの読みです)。
機能リストは、公式の例でこの4項目を持ちます。category(種類)、description(説明)、steps(端から端まで確かめる手順)、passes(真偽値)。claude.aiの複製の例では、200を超える機能に展開されました。作業役が書き換えてよいのはpassesだけ、とされています。形式にMarkdownでなくJSONを選んだ理由は、モデルが不適切に書き換えたり上書きしたりしにくいからだ、とあります。
次は、僕らが書いた短い例です。項目名は公式のとおりですが、文言は公式の例とは違い、動作確認もしていません。
{
"category": "functional",
"description": "新規チャットのボタンで、空の会話が作られる",
"steps": ["トップ画面を開く", "ボタンを押す", "空の会話ができたことを確かめる"],
"passes": false
}
各回の始まりの手順も書かれています。作業ディレクトリをpwdで確認し、Gitのログと進捗ファイルを読み、機能リストから未達の最優先のものを選び、init.shでサーバーを起動し、基本の端から端までのテスト(会話を始めて返事を受ける)で、アプリが生きていることを確かめます。既にある不具合は、新しい作業の前に直します。
終わりには、説明つきのGitコミットと、進捗ファイルの更新を行います。
テストの注意も書かれています。テストには、ブラウザ操作の自動化(Puppeteer MCPサーバー)が使われました。ただし、ブラウザ固有のアラート画面は見えず、それに頼る機能は不具合が多かった、とも書かれています。
ファイルの層(製品の機能):Claude Codeのチェックポイント
Claude Codeの公式文書によると、ターンを始めるプロンプトを送るたびにチェックポイントが作られ、直近100個分のファイルの控えが保たれます。会話と一緒に保存されるので、再開しても/rewindが使えます。控えは、既定では最後の保存から約30日で整理され、伸ばすにはcleanupPeriodDaysを設定します。戻し方は、コードと会話の両方、会話だけ、コードだけ、のほか、会話の要約(ここから/ここまで)があります。
そして、戻せないものが明記されています。
- Bashコマンドによる変更。 Bashコマンド経由の変更は追跡されません。ファイル編集の道具を通した変更だけが対象です。
- サブエージェントの編集。 通常は取り込まれない、とされています(前面で動く
context: forkのスキルは例外で戻ります。それ以外は、会話で既に編集したファイルだけが戻り、残りはGitで戻す、と書かれています)。 - 外部の変更と、リンクされたファイル。 手作業や別のセッションの編集、リンクされたファイルは、対象外です。
文書は、これを「バージョン管理の代わりにはならない」と結んでいます。
Agent SDKの版も同じ性格です。Pythonではenable_file_checkpointing=Trueとextra_args={"replay-user-messages": None}(IDを受け取るため)を指定し、rewind_files(ID)で戻します。文書は、戻るのはディスク上のファイルだけで会話は戻らない、と明記しています。チェックポイントは作ったセッションに結びつき、ディレクトリの作成・移動・削除は戻らず、ネットワーク上のファイルも対象外です。
実行状態の層:LangGraphのチェックポイント
LangGraphは、エージェントの処理を「グラフ」(ノードの並び)として動かすライブラリです。文書によると、スレッド(thread_idで区別する1本の流れ)ごとに、処理の節目(スーパーステップ)で状態を保存し、巻き戻しもその境目でだけできます。
保存先は、InMemorySaver(メモリ上。プロセスが終わると消える)、SqliteSaver、PostgresSaverが文書に出てきます。古い保存は定期的に消すよう勧められています。
再開について、文書にはこう書かれています。過去のチェックポイントを指定して呼び出すと、その手前のノードは飛ばされ、あとのノードはもう一度実行されます。AIの呼び出しや外部APIへの要求も、ここに含まれます。一方、並列のノードのどれかが失敗した場合は、成功した分の出力が保存されていて、再開のときに成功した分はやり直しません。
保存のタイミングは、durability=で選べます。"exit"、"async"、"sync"の3つから選べます。文書によると、"exit"は実行が終わるときだけ、"async"は次のステップを実行しながら非同期に、"sync"は次のステップを始める前に同期して、保存します。
見立てです。再開で後のノードがもう一度動くなら、メール送信のような外部への書き込みは二重に起きるおそれがあります。冪等性(繰り返しても結果が同じになること)の作り方は、僕らが読んだ範囲では確認できていません。書き込みを伴う手順は、再実行されても安全な形にするか、人の確認を挟むのが無難だと思います。
LangGraphの保存内容(StateSnapshot)
LangGraphのcheckpointersの文書によると、1つの保存(StateSnapshot)は、values(その時点の状態)、next(次に動くノード)、config(thread_id、checkpoint_ns、checkpoint_id)、metadata(source、writes、step)、created_at、parent_config、tasksを持ちます。
読み出しはget_stateとget_state_history、書き換えはupdate_stateです。暗号化するにはEncryptedSerializerをserdeに渡します。persistenceのページには、Postgresで使うthread_idは255文字未満にする、という注意もあります。
この記事は、実際に使って確かめた記録ではありません。
設計のときの問い(見立て)
ここからは、公式の記載を読んだうえでの僕らの見立てです。
- 「完了」を、チェックできる形で残す。 機能リストの
passesのように、確認手順と結果を書き換えにくい形式に置くのは、早すぎる完了宣言への対策として筋が通っています。 - 「戻す」と「続ける」を分けて考える。 ファイルを戻す道具(
/rewind、Git)は、続きの記憶を作りません。続けるには、進捗の記録と要約が要ります。 - 外に出た結果は、巻き戻しの対象外と考える。 Claude CodeのBashの変更、サブエージェントの編集、LangGraphの外部呼び出しは、どれも文書が限界を書いています。
- 保存の置き場所と寿命を決める。 メモリ上の保存はプロセスが終わると消え、Claude Codeの控えは約30日で整理されます。
気をつけること
- この記事は、実際に使って確かめた記録ではありません。公式の文書とエンジニアリング記事を読んでまとめたものです。
- WebFetchは、ページの要約を返します。原文のとおりではないので、文言は僕らが言い換えています。要約に含まれていた推論は事実として使っていません。
- LangGraphのdurable executionのページは、読んだ範囲では、durability modesや冪等性の中身が空でした。これらは、checkpointersのページに書かれていた分だけを使い、冪等性の指針は「確認できていません」としました。
- Anthropicの設計記事は、フルスタックのWebアプリ開発の実験です。科学研究や金融のモデリングにも当てはまるかもしれない、と記事は書いていますが、確かめたわけではありません。1つの汎用エージェントがよいのか、役割ごとの複数のエージェントがよいのかは、記事自身が未解決としています。
- 圧縮のAPIの表は、2026年10月22日の表示です。方式によってヘッダーが違います。
- エージェントの基本や評価は、別の記事で扱っています。
出典
- Effective harnesses for long-running agents(Anthropic Engineering、Anthropic、2026年10月22日確認)
- Effective context engineering for AI agents(Anthropic Engineering、Anthropic、2026年10月22日確認)
- Compaction at a token threshold(Claude Platform Docs、Anthropic、2026年10月22日確認)
- Compaction(Claude Platform Docs、Anthropic、2026年10月22日確認)
- Checkpointing(Claude Code Docs、Anthropic、2026年10月22日確認)
- Rewind file changes with checkpointing(Agent SDK、Anthropic、2026年10月22日確認)
- Checkpointers(LangGraph、LangChain、2026年10月22日確認)
- Persistence(LangGraph、LangChain、2026年10月22日確認)
更新履歴
-
2026年10月25日 書き方を直しました。
- 前:運営者が使っていないと読める書き方 → いま:「この記事は、実際に使って確かめた記録ではありません」。公式の資料を読んでまとめた記事で、使い心地は書いていない、という意味に直した
-
2026年10月22日 公式の資料を読み直して、次の点を直しました。
- 前:「Effective context engineering」の記事の更新日は2026年1月6日 → いま:2026年10月18日
- 前:APIの圧縮は「自分で頼む方式」と「自動の方式」の2つ、とだけ書いていた → いま:概要のページは、使える場面では「自分で頼む方式」を勧めている。細かい数字は自動の方式のもの
