session-cleanup-watchlisted
Install: claude install-skill ttamakijp/dev-templates
> Dispatch の scheduled-tasks MCP に登録する際は、上記
> `schedule.cronExpression` をそのまま `cronExpression` パラメータに
> 渡す。導入手順は同ディレクトリ [`README.md`](../README.md) を参照。
# session-cleanup-watch
## Overview
ADR-0014 L3 層: dev-templates Phase 4 (Operations 軸) の session
hygiene を **session の外側から** 監視する scheduled-task。
L2 (`skills/session-time-budget/SKILL.md`) は session 内部で動作するため、
主モデルが暴走 / hang / context 喪失で skill が機能停止すると alert が
止まる。L3 がこれを補う:
- 15 分毎 polling
- `~/.cowork/session-time-budget-state.json` から end_time を読む
- 残時間 30 / 15 / 5 分以内の session に proactive alert を送る
- 既に L2 / L3 が同じ milestone を送ったかは state の `alerts_sent`
を見て重複回避
## Keywords
session, watch, polling, end-of-day, hygiene, cleanup, operations,
ADR-0014, Phase 4
## 実行手順
### Step 1: state 読み込み
```bash
STATE_FILE="$HOME/.cowork/session-time-budget-state.json"
if [ ! -f "$STATE_FILE" ]; then
# state 未初期化 = 監視対象なし、idle (no notification)
exit 0
fi
```
### Step 2: アクティブ session 一覧取得
`mcp__session_info__list_sessions` を 1 回呼び出し、`is_child: false`
かつ `state in [running, awaiting_approval]` の session を抽出。
### Step 3: 各 session の deadline 確認
各 active session について:
```bash
# state.json から end_time を取得 (jq 等で)
end_time=$(bash scripts/session-state.sh get "$session_id" 2>/dev/null)
if [ -z "$end_time" ] || [ "$end_time" = "null" ]; then
# この session は end_time 未宣言 (unknown) → skip
continue
fi
```
現在時刻と比較し、残時間を計算:
| 残時間 | milestone | alert 送信 |
|---|---|---|
| > 35 分 | none | 沈黙 |
| 25-35 分 | `30m` | alerts_sent に