0
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

ゴールデンウィーク、家族と出かけて Claude Code に留守番させる前に、入れておきたい hook 3 つ

0
Posted at

明日からゴールデンウィークだ。家族で出かける予定があり、その間も Claude Code には簡単な作業を任せて出ようと思っている。データの整理や、長めのドキュメントの草案づくりみたいな、私がいなくても進められそうな仕事だ。

ただ、過去の経験から言うと、Claude Code は「留守番中」 という状況を知らない。人間が連休でゆっくりしている間も、AI は同じペースで動き続ける。これが本当に怖い。実際、以前似たようなことをやって、半日で 5,000 円分くらいのトークンを溶かしたことがある。気づいたのは家から戻った時、API の利用画面を開いた瞬間だった。

連休前にやっておくと、帰ってきた時に自分が泣かなくて済むことが、3 つある。

1. 自動圧縮は止められない、と覚悟する

「長く動かすと context compaction が走って文脈が消えるから、autoCompactEnabled を false にしておけば大丈夫」 と書いてある記事もあるが、これは効かない。

GitHub Issue #42817 で、auto-compact を無効化する全ての公式経路 (/configclaude config setsettings.json、環境変数) が現在は機能していない、という測定付きの報告が並んでいる。コンテキスト容量の約 35% で勝手に圧縮が走るケースまで観測されている。

つまり、留守番中に圧縮は必ず起きる。問題は「圧縮が起きること」 ではなく「圧縮の前の状態が記録されていないこと」。これは hook で対処できる。

2. 留守番中の暴走を止める「予算 hook」

Stop hook で 1 日のトークン消費量を読み、上限を超えたら警告を出す仕組みを入れておく。

#!/usr/bin/env bash
# daily-cost-guard.sh — 当日累計が閾値を超えたら警告して停止する

DAILY_LIMIT_USD=5.00
WARN_THRESHOLD_USD=3.50
LOG_DIR="${HOME}/.claude/cost-log"
mkdir -p "${LOG_DIR}"
TODAY=$(date +%Y-%m-%d)
LOG_FILE="${LOG_DIR}/${TODAY}.jsonl"

# Claude Code の出力から当日累計を集計するロジックは省略
TODAY_USD=$(your_aggregator_here)

if (( $(echo "$TODAY_USD > $DAILY_LIMIT_USD" | bc -l) )); then
  echo "🛑 当日 \$${TODAY_USD} が上限 \$${DAILY_LIMIT_USD} を超えました" >&2
  exit 2  # Stop hook で exit 2 = 作業を止める
fi

~/.claude/settings.json に登録:

{
  "hooks": {
    "Stop": [
      { "matcher": "", "hooks": [
        { "type": "command", "command": "/path/to/daily-cost-guard.sh" }
      ]}
    ]
  }
}

これがあると、暴走しても上限で止まる。家族と過ごしている間に予算が爆発する事故を防げる。

3. 帰宅した時に進捗が分かる「圧縮直前の保存 hook」

PreCompact hook で、圧縮が走る直前に未コミットの変更を git に強制保存する。圧縮で AI が「何の作業をしていたか」 を忘れても、git 履歴から復旧できる。

#!/bin/bash
# precompact-git-checkpoint.sh — 圧縮直前で git に一時保存を作る

git rev-parse --is-inside-work-tree &>/dev/null || exit 0

CHANGES=$(git status --porcelain 2>/dev/null | wc -l)
[ "$CHANGES" -eq 0 ] && exit 0

BRANCH=$(git rev-parse --abbrev-ref HEAD 2>/dev/null)
TIMESTAMP=$(date -u '+%Y%m%d-%H%M%S')

git add -A 2>/dev/null
git commit -m "checkpoint: pre-compact auto-save (${CHANGES} files, ${TIMESTAMP})" --no-verify 2>/dev/null

echo "📸 Pre-compact 一時保存: ${CHANGES} ファイル on ${BRANCH}" >&2
echo "  復旧は: git log --oneline -5" >&2

settings.json への登録:

{
  "hooks": {
    "PreCompact": [
      { "matcher": "", "hooks": [
        { "type": "command", "command": "/path/to/precompact-git-checkpoint.sh" }
      ]}
    ]
  }
}

帰宅後、git log --oneline -5 を見れば「最後に AI が何をやったか」 がわかる。圧縮で AI 自身が忘れていても、git は忘れない。

連休に持って行きたい順番

家族と出かける前に、私はこの順番で確認する。

  1. 予算 hook が動いているか (~/.claude/cost-log/$(date +%Y-%m-%d).jsonl が増えるか軽く回して試す)
  2. PreCompact hook が登録されているか (~/.claude/settings.jsonPreCompact 配列を目視)
  3. 任せる作業を git で枝を切って始める (失敗しても main に戻れる状態にしておく)

完璧な留守番にはならない。でも「予算が爆発」 と「進捗ゼロ」 のダブルパンチで連休が台無しになる事故は、これでだいぶ減らせる。

人間は連休があるが、Claude Code は連休を知らない。だから連休前にこちらで仕掛けを作っておくしかない。家族の方が AI より大事だ。それを揃えてから、出かけよう。

0
0
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
0
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?