name: session-end description: End-of-session handoff — audit tasks, save Engram session summary, update Auto memory (MEMORY.md), and propose commit+push. Use when the user wants to close the current session, wrap up work, save progress to long-term memory, prepare for next session handoff, or runs "/session-end". user-invocable: true argument-hint: '[--dry-run | --auto] (任意)'
/session-end — セッション終了ハンドオフ
ユーザーが「セッション閉じる」「終わりにする」「次に引き継ぐ」と言った時に呼ばれる、次セッションへの引き継ぎを 1 コマンドで完結させる Skill。
このスキルが呼ばれる条件
以下のいずれかがユーザー発言に含まれる:
- 「セッション閉じる」「セッション終了」「終わりにする」「wrap up」
- 「次に引き継ぐ」「引き継ぎして」「ハンドオフ」
- 「今日はここまで」「一区切りつける」
/session-endの明示呼び出し
やってはいけないこと(重要)
- ユーザー承認なしに commit / push しない(Phase 2 で必ず提案を提示)
.env*.keycredentials.*を memory や commit に含めない(プライバシー禁則ハードガード)- 長すぎる Engram サマリを保存しない(What / Why / Where / Learned の構造で簡潔に)
- memory 更新を毎回しない(重要な学びが無いセッションではスキップ判断)
- 他の Skill を暴走起動しない(
/retroは別目的なので呼ばない)
ワークフロー: 3 フェーズ設計
Phase 1: AUDIT (read-only, 完全自動)
└→ Phase 2: PROPOSE (★ユーザー承認ポイント)
└→ Phase 3: EXECUTE (承認後並列実行)
Phase 1: AUDIT(完全自動、read-only)
以下を 並列で 実行し、セッション状態を把握する:
1.1 タスク状態確認
TaskList を呼び出し、以下を分類:
- completed: 何個
- in_progress: 何個 (ある場合は警告)
- pending: 何個 (ある場合は警告)
1.2 Git 状態確認
PATH=/usr/bin:/bin:$PATH git status --short
PATH=/usr/bin:/bin:$PATH git log --oneline -5
PATH=/usr/bin:/bin:$PATH git branch --show-current
PATH=/usr/bin:/bin:$PATH git diff --stat
WSL2注意:
PATH=/usr/bin:/bin:$PATHを必ず prepend する (literal${PATH}問題回避)
以下を抽出:
- uncommitted 変更: modified / untracked の一覧
- 現在のブランチ: main か feature branch か
- 直近 commit: 今セッションで作ったものか既存か
- branch protection: main の場合は要注意フラグ
1.3 会話ログから重要な学び・決定を抽出
本セッションの会話全体を振り返り、以下を拾う:
- 決定事項: ユーザーが「OK」「進めて」「採用」と言ったもの
- 発見: デバッグで判明した root cause, 外部ドキュメントで確認した仕様
- フィードバック: ユーザーが訂正した点、明示的に褒めた点
- ハマりポイント: 同じミスを繰り返さないために記録すべきもの
これらは後で Engram 保存内容と MEMORY.md 更新候補として使う。
1.4 Auto memory の状態確認
PATH=/usr/bin:/bin:$PATH ls ~/.claude/projects/*/memory/MEMORY.md 2>/dev/null
現プロジェクトの MEMORY.md パスを特定し、既存内容と重複しないか確認する。
1.5 先送り (deferred scope) 棚卸し — Sess99 恒久策
背景 (Sess99 / Issue #1119-#1124): Sess93 の「follow-up 送り」が Issue 未起票のまま 追跡消失し、user が v13 実機検証で「直っていない」と発見した。先送りの記録先が PR 本文 / ADR のみだと誰も追跡しない — セッション終了時に必ず棚卸しする。
今セッションの会話ログ + 作成した PR 本文から 意図的に先送りした項目 を抽出する:
- キーワード: 「follow-up」「先送り」「持ち越し」「deferred」「後日」「次セッション」「scope 外」
- 今セッションの PR は
gh pr list --search "author:@me" --state all --limit 10で取得し本文を確認
抽出した各項目について:
- Issue # が存在するか確認 (
gh issue list --search "<キーワード>") - Issue が無い先送りは Phase 2 で ⚠️ 警告し、Issue 起票を提案に含める
- user が議論で要望した内容の先送りは、Phase 2 の提示で 「やらなかったこと」として明示する
1.6 🛑 プライバシー禁則ハードガード
以下を検出したら即停止し、ユーザーに警告する:
- staged or modified ファイルに
.env.envrc*.pem*.keycredentials.json~/.secrets.d/* - 会話ログ内にトークン・API key・パスワードが平文で含まれている疑い
- 氏名・メールアドレス・電話番号がセッション要約に入ろうとしている
検出時は Phase 2 に進まず、ユーザーに該当箇所を明示して判断を仰ぐ。
Phase 2: PROPOSE(★ユーザー承認ポイント)
Audit 結果を整形して 1 画面にまとめて提示し、ユーザーに「OK」or「修正」の判断を求める。
提示フォーマット (必ずこの構造):
## 📋 セッション終了チェック
### タスク状態
- ✅ completed: N 個
- ⚠️ pending / in_progress: M 個 (← 残ってる場合のみ表示)
### Git 状態
- ブランチ: `branch-name`
- uncommitted 変更:
- M path/to/file1 (短い説明)
- ?? path/to/file2 (短い説明、commit 対象 or 除外)
- 今セッション commit: N 件 (`hash` 〜 `hash`)
### 💾 Engram に保存するサマリ草案
\`\`\`
## Goal
[1 行]
## Instructions
[ユーザー preference があれば]
## Discoveries
- [発見1]
- [発見2]
- [アドリブ成功 (計画外でうまくいった工夫) があれば 1 件以上含める。仕組み化候補なら実装先 (file/Issue) を 1 行付す — /retro Step 5 アドリブ成功レンズの毎セッション入口、Sess103 由来]
## Accomplished
- ✅ [完了1]
- 🔲 [次セッション候補]
## Relevant Files
- path/to/file — 説明
\`\`\`
### ⏸ 先送り項目(deferred scope、Sess99 恒久策)
[今セッションで先送りした項目の一覧。各項目に Issue # を併記。
Issue 未起票の先送りがあれば ⚠️ + 起票提案。なければ「なし」]
### 📚 MEMORY.md 更新提案
[新規セクション草案 or "更新なし (重要学習なし判定)"]
### 🚀 commit + push 提案
[含める場合のみ]
- コミット対象: [ファイル一覧]
- 除外: [ファイル一覧と理由]
- コミットメッセージ草案:
\`\`\`
<type>(<scope>): <subject>
<body>
Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
\`\`\`
- push 先: `origin/<branch>`
---
**この内容で進めてよろしいですか?**
- `OK` → Phase 3 実行
- `修正: xxx` → 該当箇所を修正して再提示
- `スキップ: git` → git 関連だけスキップして Engram/memory のみ実行
Phase 3: EXECUTE(承認後、可能な限り並列実行)
ユーザーが「OK」と言ったら、以下を 並列で 実行:
3.1 Engram 保存(必須、ほぼ毎回実行)
mem_session_summary を呼び出す:
- project: 現プロジェクト名 (pwd から推論)
- content: Phase 2 で提示したサマリ本文
空セッション(会話が 5 メッセージ以下 or 重要な決定なし)の場合はスキップ可。
3.2 MEMORY.md 更新(該当時のみ)
重要な学びがある場合のみ Edit ツールで追記:
- 既存セクションの末尾 or 新規セクション追加
- フォーマットは既存スタイルに合わせる (プロジェクトごとに異なる場合あり)
3.3 Git commit + push(承認時のみ)
PATH=/usr/bin:/bin:$PATH git add <specific files> # -A は禁止
PATH=/usr/bin:/bin:$PATH git commit -m "$(cat <<'EOF'
<message>
Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
EOF
)"
PATH=/usr/bin:/bin:$PATH git push origin <branch>
main ブランチ + branch protection あり の場合は:
- 単独コミット → 一時 relax で push (Repolog の既存運用に合わせる)
- または「PR 作成しますか?」と再確認
3.4 最終レポート
実行完了後、以下のチェックリストをユーザーに提示:
## ✅ セッション終了完了
| 項目 | 結果 |
| ------------------------ | ---------------------------------------- |
| タスクリスト | N/N completed |
| Engram サマリ保存 | ✅ project: xxx |
| MEMORY.md 更新 | ✅ / ⏭ skipped (理由) |
| commit + push | ✅ `hash` → `origin/branch` / ⏭ skipped |
| プライバシー禁則チェック | ✅ clean |
**次セッション開始時の復旧ポイント**:
- `mem_context` で今回のサマリが復旧可能
- MEMORY.md に追加された内容: [1 行要約]
- 次セッションの候補タスク: [あれば 1-2 行]
お疲れさまでした。
モード
/session-end(標準)
Phase 1 → Phase 2(承認待ち)→ Phase 3。上記フロー通り。
/session-end --dry-run
Phase 1 → Phase 2 で 提案を提示するだけ。Phase 3 は実行しない。 「こういう内容で保存します」の確認用途。
/session-end --auto
Phase 2 の承認をスキップして Phase 1 → Phase 3 を直実行。 非推奨デフォルト。慣れた後、重要な commit が無いセッション向け。 プライバシー禁則ハードガードは --auto でも動作する。
エッジケース対応
| ケース | 挙動 |
|---|---|
| タスクに pending が残ってる | ⚠️ 警告 + "強制終了しますか? / タスク完了を待ちますか?" |
| uncommitted が 20 ファイル超 | ⚠️ "多すぎます。全部 commit で良いか再確認" |
| branch が main + protection あり | ⚠️ 一時 relax で push か PR 作成か確認 |
| 会話が短い (5 メッセージ以下) | Engram 保存スキップ (価値なし判定) |
.env *.key credentials.* が staged |
🛑 即停止。プライバシー禁則、ユーザー判断待ち |
| push 失敗 (network) | Engram/MEMORY は保存済みでそのまま終了、ローカルに commit 残る |
| Engram MCP 接続エラー | MEMORY.md と commit は実行、Engram のみスキップして警告 |
| 既に MEMORY.md に同じ内容 | 重複判定で更新スキップ |
他の Skill との棲み分け
| Skill | 目的 | 使うタイミング |
|---|---|---|
/session-end |
毎セッション の終了手続き | 毎回のセッション終わり |
/retro |
マイルストーン振り返り (KPT + 5-why + 次アプリ handoff) | リリース / 大きな機能完了時 |
/progress |
3 軸進捗監査 | 定期チェック (週次等) |
/memory-review |
memory システムの 2 週間メンテナンス | 腐敗チェック / 昇華候補抽出 |
重なり注意: /retro は今回のセッションだけでなく期間全体を扱う。/session-end は今回のセッションに閉じた範囲のみ扱う。
プロジェクト非依存の設計
この Skill は 全プロジェクトで共通使用 することを前提とする:
- Engram project 名:
pwdから basename で推論 (Repolog,app_template, etc.) - MEMORY.md パス:
~/.claude/projects/<hash>/memory/MEMORY.mdを glob で検索 - commit message スタイル: 既存
git logから推論 (Conventional Commits か否か) - branch protection:
gh api repos/:owner/:repo/branches/:branch/protectionで判定
プロジェクト固有の設定が必要になったら、将来的に ~/.claude/skills/session-end/config.yaml でプロジェクト別設定を持たせる (現状は不要)。
最重要原則
- プライバシー禁則は例外なく守る (
.env/ API key / 個人情報) - ユーザー承認なしに外部影響のある操作をしない (push / 共有リソース変更)
- Engram と MEMORY.md の使い分けを守る:
- Engram: 時系列のセッションサマリ (
mem_contextで復旧用) - MEMORY.md: 永続ルール・設定・長期パターン (index 型)
- Engram: 時系列のセッションサマリ (
- 冪等性: 同じセッションで 2 回
/session-endしても壊れない - 失敗時はグレースフル: 部分失敗でも他のフェーズは完了させる
Notion 完了報告 (案 7、 Sess108)
Phase 3 (EXECUTE) の 最後 に /notion-report --auto-from-session-end を自動連結で実行する。
Phase 3.5: Notion 完了報告 (自動連結)
1. ENV flag を確認: BONSAI_NOTION_SYNC=off なら skip + Phase 3.4 最終レポートに「⏭ Notion report skipped (env off)」 追記
2. /notion-report --auto-from-session-end を実行
- 今セッション完了 PR/Issue を gh CLI で抽出
- Engram の「Notion 依頼取込」 履歴 (= page_id 対応表) と join
- notion-create-comment で対応ページに完了報告投稿
- Sess<N>-summary 子ページを notion-create-pages で作成
3. 結果を Phase 3.4 最終レポートに「✅ Notion report 投稿済 (N 件 comment + 1 子ページ)」 として追記
これにより /session-end 1 コマンドで以下 4 つが一気通貫:
- Engram 保存 (Phase 3.1)
- MEMORY.md 更新 (Phase 3.2)
- commit + push (Phase 3.3)
- Notion 完了報告 (Phase 3.5、 新規)
エッジケース
| ケース | 挙動 |
|---|---|
| BONSAI_NOTION_SYNC=off | silent skip + 最終レポートに「⏭ env off」 追記 |
| Notion MCP 未認証 / network 不調 | silent skip + 最終レポートに「⏭ Notion MCP unavailable」 |
| 完了 PR が 0 件 | report は子ページ作成のみ (完了内容なし summary) |
| Engram に page_id 履歴なし | comment は skip、 子ページ作成のみ実行 |
設計理由
- 対称性:
/notion-intake(= 入口) と対で双方向同期を完成 (Sess108 案 7 Stage C) - 副作用最小化: report は comment + 子ページのみ、 Status / Stage 変更はしない
- idempotency: 同 Sess
-summary が既にあれば update に切替 (= /session-end 2 回呼出しても壊れない)
詳細は .claude/skills/notion-report/SKILL.md を参照。