◉CLAUDE LABEN
●2.1.301 — vim の % モーション、VS Code パネルでの LaTeX 数式表示、使用量上限待ちのリトライ監視の上限が入りました(10/15)●2.1.299 — 200K トークン超で約54分放置した会話はアイドル圧縮。MCP の許可ルールは名指ししたサーバーだけに一致します●SONNET 4.5 — Claude API での提供終了は 11/30、残り45日。移行先は Sonnet 5.5●WINDOWS — 日本語の環境でだけフックが黙って壊れる報告があり、文字コードの確認が呼びかけられています●FAST MODE — Opus 5.5 の Fast mode がリサーチプレビューを終え、ベータヘッダーが不要になりました(10/15)●NEW — Cowork に渡したフォルダの先頭に、十行の約束ファイルを置いてみました●2.1.301 — vim の % モーション、VS Code パネルでの LaTeX 数式表示、使用量上限待ちのリトライ監視の上限が入りました(10/15)●2.1.299 — 200K トークン超で約54分放置した会話はアイドル圧縮。MCP の許可ルールは名指ししたサーバーだけに一致します●SONNET 4.5 — Claude API での提供終了は 11/30、残り45日。移行先は Sonnet 5.5●WINDOWS — 日本語の環境でだけフックが黙って壊れる報告があり、文字コードの確認が呼びかけられています●FAST MODE — Opus 5.5 の Fast mode がリサーチプレビューを終え、ベータヘッダーが不要になりました(10/15)●NEW — Cowork に渡したフォルダの先頭に、十行の約束ファイルを置いてみました
記事一覧/Claude Code
⟐ Claude Code/2026-07-10上級

PreCompact と SessionEnd で長時間セッションの決定事項を引き継ぐ

自動コンパクションで消えるのは会話ではなく「なぜそう決めたか」です。PreCompact / SessionEnd / SessionStart の3フックで決定ログを外部ファイルへ退避し、次のセッションへ確実に手渡す実装を、動くコードと実測値つきで解説します。

Claude Code265hooks22context6automation55PreCompact

✦ プレミアム記事

深夜 2 時に走らせていた自動処理のセッションが、コンパクションを挟んだ直後に「さっき却下したはずの案」を再提案してきたことがあります。

会話の内容は要約されて残っていました。消えていたのは、なぜその案を却下したのかという一行だけでした。

コンパクションは文字数を削るのであって、重要度で選り分けてくれるわけではありません。要約に残るのは「何をしたか」で、落ちるのは「なぜそうしたか」です。個人開発で複数のサイトを夜間に回している立場からすると、この一行の欠落が翌朝の手戻りに直結します。

そこで私は、コンパクションが走る直前に決定事項だけを外部ファイルへ逃がし、次のセッションの開始時に読み戻す仕組みを入れました。使うのは Claude Code の PreCompact・SessionEnd・SessionStart という 3 つのフックです。

コンパクションで落ちるのは「判断の根拠」

自動コンパクションはコンテキストが上限に近づいたときに発火します。手動の /compact と同じ処理ですが、無人運用では発火のタイミングを選べません。

私の環境で 4 サイト分の記事生成セッションを 6 時間走らせたときのトランスクリプトは 14.2 MB(JSONL・約 3,900 行)でした。コンパクション後にセッションへ残っていた要約は 4,100 文字程度です。圧縮率としては妥当ですが、この 4,100 文字に「Cloudflare Workers の 62 MiB 制限があるので articles.json にはメタデータだけを載せる」という前提は残っていませんでした。

要約が悪いのではありません。要約に何を残すかを指定していないことが問題でした。

ならば、要約に期待するのをやめて、自分で抜き出して外に置けばよい。それがこの記事の設計です。

PreCompact フックが受け取るもの

PreCompact は、自動・手動を問わずコンパクションが実行される直前に発火します。フックスクリプトは標準入力から JSON を1つ受け取ります。

{
  "session_id": "0b8f2c14-...",
  "transcript_path": "/Users/you/.claude/projects/.../0b8f2c14-....jsonl",
  "cwd": "/Users/you/work/claudelab.net",
  "hook_event_name": "PreCompact",
  "trigger": "auto",
  "custom_instructions": ""
}

押さえておきたいのは次の 3 点です。

trigger は "auto" か "manual" のどちらかです。/compact を手で叩いたときだけ "manual" になります。無人運用で拾いたいのはほぼ "auto" の方です。

transcript_path は、そのセッションの全履歴が入った JSONL ファイルの絶対パスです。1 行 1 メッセージで、まだコンパクション前の状態が読めます。ここが肝心で、PreCompact を逃すとこの生の履歴には二度とアクセスできません。

custom_instructions は手動コンパクション時に渡した指示が入ります。自動時は空文字です。

フック発火タイミングこの設計での役割
PreCompactコンパクション直前生の履歴から決定事項を抽出して退避
SessionEndセッション終了時最終スナップショットと索引の確定
SessionStartセッション開始・再開時退避した決定事項をコンテキストへ注入
✦

ここまでお読みいただきありがとうございます。

この記事の続きを読む

この先には、実装コードやベンチマーク結果など、実務でお役に立てる内容をご用意しています。このサイトは広告を掲載しておらず、サーバーや開発にかかる費用はメンバーの皆様のご支援で成り立っています。もしお役に立てていましたら、ご支援いただけますと大変ありがたいです。

この記事で得られること
✦長時間セッションでコンパクションのたびに前提が抜け落ちて困っていた方が、PreCompact フックで決定事項だけを外部へ退避できるようになります
✦transcript_path の JSONL を安全に読む Python 実装と、SessionStart の additionalContext で復元するまでの一連のコードが手に入ります
✦60 秒タイムアウト・stdout の扱い・trigger 値の取り違えという、実際に踏んだ3つの落とし穴を回避して無人運用に組み込めます
Stripe による安全な決済 · いつでもキャンセル可能
✦

この記事を購入する

この先の内容をすべてお読みいただけます。一度のご購入で、いつでも何度でもアクセスできます。このサイトは広告を掲載しておらず、皆さまのご支援がサーバー費用などの運営を支えています。

または
メンバーシップなら全記事が読み放題 →
シェア

お読みいただきありがとうございます

Claude Lab は広告なしで運営しており、サーバー費用などの運営コストはメンバーシップのご支援で賄っています。実装コード・ベンチマーク・本番設計パターンなど、実務でお役立ていただける記事を毎日更新しています。もし読んでよかったと感じていただけましたら、ぜひご覧ください。

  • ✦コピー&ペーストで使える実装コード付き
  • ✦毎日新しい上級ガイドを追加
  • ✦¥580/月 または ¥1,480 の永久アクセス
メンバーシップを見る →

関連記事

⟐ Claude Code2026-10-15
日本語フォルダ名を守るはずのフックが、一度も止めてくれませんでした — Python の stdin が cp932 で読んでいた話
「経理」「議事録」などの日本語フォルダを守る PreToolUse フックが、Python の stdin 既定が cp932 の環境では素通りします。再現の手順と 3 行の直し方、確認用の 1 コマンドを書き残します。
⟐ Claude Code2026-10-14
onFailure を block にしても、jq が無い環境では公式例の rm -rf ブロックは素通りしました
PreToolUse の門番フックは、落ちたときに通すのか止めるのか。公式例を jq の無い環境で走らせると exit 0 で素通りしました。終了コード10通りの実測、直し方、settings.json を走査して素通りを洗い出すスクリプトをまとめます。
⟐ Claude Code2026-10-05
「コミットは私がします」と書いたのに git log に一行増えていた朝、指示を強めるのをやめました
Claude Code に「コミットしないで」と頼んだのにコミットされたとき、まず git reset --soft で戻し、permissions.deny と PreToolUse hook の二層で物理的に止める手順です。deny ルールが素通しする git -c の形と、hook の試し方を書き残します。