Claude Code /recap & Away-Summary 完全ガイド — v2.1.108公式機能と自作Skillの境界線を引き直す
1Mコンテキストになっても、4時間ぶりに戻ってきたターミナルで「で、何やってたんだっけ?」となる問題は消えない。v2.1.108(2026-04-14)で追加された /recap と away-summary は、これまでコミュニティが hatawong/claude-recap や session-recap Skill で埋めてきた穴を、ついに公式が塞ぎにきた機能だ。本記事では、自律デーモンで Claude Code を24時間動かしている運用者の視点から、公式機能で何が代替できて、何が依然として Skill 実装に残るのかをコード付きで線引きする。
v2.1.108で追加された /recap と away-summary の正体
公式機能としての /recap の挙動
/recap は v2.1.108 で組み込みスラッシュコマンドとして追加された。インタラクティブセッション中に明示的に叩くと、現在のセッションコンテキストを要約してチャット先頭に提示してくれる。
> /recap
[recap]
- 直近のタスク: src/pipelines/dreamy-poster.ts のリファクタ
- 未解決: Twitter API のレート制限ハンドリング
- 次の一手: image-generator.ts に retry を追加
away-summary との違いと自動発火条件
away-summary は離席判定(一定時間以上の無操作)後の最初のプロンプトで、裏側で自動的に走る要約挿入だ。/recap が「明示呼び出し」なのに対し、away-summary は「自動挿入」という役割分担になっている。
注意点として、要約生成にはトークン課金が発生する。1Mコンテキストで毎回サマリを取ると、地味にコストが効いてくる。
CLAUDECODEENABLEAWAYSUMMARY とテレメトリ無効環境の挙動差
環境変数によるオプトイン/オプトアウト
v2.1.108 初期は テレメトリ有効環境のみで自動発火 する仕様だった。これが v2.1.110 で Bedrock / Vertex / Foundry / DISABLE_TELEMETRY=1 環境にも自動有効化が拡大された。
オプトアウトは2系統ある。
# ~/.zshrc などに記載
export CLAUDE_CODE_ENABLE_AWAY_SUMMARY=0 # 完全無効化
export CLAUDE_CODE_ENABLE_AWAY_SUMMARY=true # 強制有効化
true で有効化、0 で無効化という非対称な命名なので、ここは正直最初は戸惑った。false ではなく 0 で無効になる点に注意。
/config からのGUIオプトアウトも v2.1.110 で追加されている。launchd で動かしている自律デーモン側は plist に環境変数を追記する。
<key>EnvironmentVariables</key>
<dict>
<key>CLAUDE_CODE_ENABLE_AWAY_SUMMARY</key>
<string>0</string>
</dict>
なお、公式ドキュメント(commands/settings/env-vars/data-usage/common-workflows)には2026-04時点で recap 関連の記載がない。Issue #48084 / #48863 が一次情報になる。
Compaction耐性と長時間セッションでの実挙動検証
/compact との関係と既知バグ
/recap はセッション内コンテキストを再利用して要約を作る。つまり /compact 後はコンテキスト自体が圧縮済みなので、精度はモデルとプロンプト依存になる。
context full時に /compact が失敗するバグ(Issue #23047, #23751)の回避策として、手前で /recap を撃って要点を上に固定してから /compact する という運用が効く。
# Compaction前後で /recap の出力を比較
claude -c "/recap" > /tmp/recap_before.txt
claude -c "/compact"
claude -c "/recap" > /tmp/recap_after.txt
diff /tmp/recap_before.txt /tmp/recap_after.txt
JSONL トランスクリプトを cold-read する hatawong/claude-recap のアプローチは、Compaction で失われた粒度を復元できる点で今でも有利だ。slave デーモンの実測でも、4時間以上空いたセッションでは cold-read 系の方が「何を試して何が失敗したか」を拾えていた。
自作recap Skill / フックの再評価 — 何を残すべきか
公式で代替可能になった層
- 単純な離席後サマリ
- 直近トピックの想起
- セッション再開時の「最後にどこまでやったか」
これらは公式 /recap で十分。自作 Skill は不要になった。
依然としてSkill実装に残る層
| 機能 | 公式 /recap | hatawong/claude-recap | session-recap Skill |
|---|---|---|---|
| セッション内サマリ | ◎ | △ | △ |
| JSONL cold-read | × | ◎ | △ |
~/.memory/ 永続化 | × | ○ | ◎ |
| プロジェクト横断統合 | × | △ | ◎ |
| Stopフック自動保存 | × | ○ | ◎ |
Stopフックで /recap 結果を永続化するパターンは依然有効。
// ~/.claude/settings.json
{
"hooks": {
"Stop": [{
"matcher": "*",
"hooks": [{
"type": "command",
"command": "bash ~/.claude/scripts/save-recap.sh"
}]
}]
}
}
# ~/.claude/scripts/save-recap.sh
#!/bin/bash
DATE=$(date +%Y-%m-%d-%H%M)
RECAP_DIR="$HOME/.memory/recaps"
mkdir -p "$RECAP_DIR"
claude -p "/recap を出力して" > "$RECAP_DIR/$DATE.md"
自律デーモン運用者向け:24/365稼働での復帰戦略
バックグラウンドジョブでの復帰パターン
ここが一番のハマりどころで、claude -p --dangerously-skip-permissions の 非対話モードでは /recap は効かない。インタラクティブセッション前提の機能なので、slave のような自律デーモンでは別設計が必要だ。
具体的には、ジョブ完了時に execution_logs へ要約を残し、次ジョブのプロンプト先頭に注入する二層構成にする。
// src/claude-runner.ts (抜粋)
async function runWithHandoff(prompt: string, prevJobId?: number) {
let handoff = "";
if (prevJobId) {
const prevSummary = db
.select({ summary: executionLogs.summary })
.from(executionLogs)
.where(eq(executionLogs.jobId, prevJobId))
.get();
if (prevSummary?.summary) {
handoff = `<previous-job-recap>\n${prevSummary.summary}\n</previous-job-recap>\n\n`;
}
}
const result = await runClaude(handoff + prompt);
const summary = await runClaude(
`次のジョブ向けに3行で要約してください:\n${result}`
);
await db.insert(executionLogs).values({ jobId, summary });
return result;
}
Slack通知との統合
要約を Slack Webhook に流しておくと、離席中の進捗把握が一気に楽になる。これは地味に便利。
まとめ
v2.1.108 の /recap と away-summary は、コミュニティが先に作っていた recap Skill 群の「一番素朴なユースケース」をきれいに置き換える。一方で、JSONL cold-read による高精度サマリ、~/.memory/ への永続化、自律デーモンでのジョブ間引き継ぎは依然として Skill / フック実装の領域に残る。
テレメトリ無効環境では CLAUDE_CODE_ENABLE_AWAY_SUMMARY の挙動差(true で強制有効、0 で無効)に注意し、長時間セッション運用では 「公式 /recap × 自前永続化」の二層構成 が現時点のベストプラクティスだ。
