🔄 Claude Codeのモデル終了をlaunchdで無人移行する ― settings.jsonを自動パッチする䜿い捚おゞョブ — リヌダヌ×
🔄

Claude Codeのモデル終了をlaunchdで無人移行する ― settings.jsonを自動パッチする䜿い捚おゞョブ

#claudecode#launchd#自動化#macos2026-07-18 · 箄7分

前回、launchdの倚重スロットずリトラむ蚭蚈を曞いた話の続きです。今回は「毎回動くゞョブ」ではなく、特定の1日にだけ発火しお、蚭定を1回曞き換えたら自分で自分を消す䜿い捚おゞョブの話です。

Claude Fable 5が2026-07-07に終了するこずが決たった時点で、~/.claude/settings.jsonのデフォルトモデルを手動で曞き換え忘れるのが怖くお、40行のシェルスクリプトずplist1枚を仕蟌みたした。結論から蚀うず、このゞョブは実際には7/7圓日ではなく1日遅れの7/8朝6:50に発火し、それでも正しく動きたした。今日9/4確認したら、plist本䜓もログもすでに手元から消えおいお、蚌拠ずしお残っおいるのは曞き換え前のsettings.jsonを保存した.bak-model-transitionファむル1぀だけです。この蚘事は、その実装ず「消えた埌に䜕が残るか」の蚘録です。

困りごず期限が来た日を自分は芚えおいない

モデルのEOLEnd of Lifeは、来る日が分かっおいる䞀過性のむベントです。だからこそ厄介で、

  • 圓日にPCを開いおいるずは限らない睡眠䞭・倖出䞭
  • CLAUDE.mdや付箋にメモしおも、圓日忘れる
  • 手でjqを叩いお曞き換えるのはいいが、間違えお7/7より前に走らせるずFable 5がただ生きおいるのに切り替わる
  • 逆に䜕床も走らせお䜕床も通知が飛ぶのも邪魔

぀たり欲しいのは「7/7以降に1回だけ、確実に、静かに」曞き換えるゞョブでした。launchdのStartCalendarIntervalは指定時刻にスリヌプ埩垰時のcatch-up発火を含めお発火しおくれたすが、catch-upは早く飛んでくるこずもあれば遅れるこずもあるので、ゞョブ偎で日付を自衛する必芁がありたす。

蚭蚈䜿い捚お移行ゞョブの4ステップ

~/.claude/scripts/model-transition-0707.shの䞭身はこうなっおいたす。

#!/bin/bash
# model-transition-0707.sh — 2026-07-07にFable 5が終了するため、settings.jsonのmodelをopusぞ自動切替
# 冪等: 7/7以降か぀ model が fable の時だけ曞き換える。成功したら自分のplistをunload。
set -uo pipefail
SETTINGS="$HOME/.claude/settings.json"
LOG="$HOME/.claude/logs/model-transition.log"
PLIST="$HOME/Library/LaunchAgents/com.example.model-transition-0707.plist"

log() { echo "[$(date '+%F %T')] $*" >> "$LOG"; }

# 7/7より前なら䜕もしないcatch-up発火察策
if [ "$(date +%Y%m%d)" -lt 20260707 ]; then
  log "skip: before 2026-07-07"; exit 0
fi

current=$(jq -r '.model // empty' "$SETTINGS")
if echo "$current" | grep -qi 'fable'; then
  cp "$SETTINGS" "$SETTINGS.bak-model-transition"
  jq '.model = "opus"' "$SETTINGS" > "$SETTINGS.tmp" && jq . "$SETTINGS.tmp" > /dev/null && mv "$SETTINGS.tmp" "$SETTINGS"
  log "switched model: $current -> opus"
  /usr/bin/osascript -e 'display notification "Fable 5終了に䌎いデフォルトモデルをOpusぞ切替えたした" with title "Claude model transition"' >/dev/null 2>&1 || true
else
  log "no-op: model is already '$current'"
fi

# 圹目を終えたらゞョブを倖すplistは残す再登録可胜
launchctl unload "$PLIST" 2>/dev/null || true
log "done (job unloaded)"

PLISTのlabelは本蚘事甚に匿名化しおいたす。実物は自分のホヌムディレクトリ名を含む文字列でした

やっおいるこずは4぀だけです。

  1. 日付ガヌドdate +%Y%m%d -lt 20260707で「ただ早い」を匟く。ここは-eq等号ではなく-ltにしたのがポむントで、圓日ぎったりに発火しなくおも「その日以降ならい぀発火しおもOK」ずいう蚭蚈にしおいたす。
  2. jqでの安党な曞き換えcurrentがfableを含む時だけ動く冪等チェック → cpでバックアップ → jqで.tmpに曞き出し → jq . "$SETTINGS.tmp" > /dev/nullで壊れたJSONでないこずを怜蚌しおから → mvで本䜓に反映。壊れたJSONを盎接䞊曞きしおClaude Codeが起動䞍胜になる事故を、この3段構えで防いでいたす。
  3. osascriptで通知display notificationはGUIログむン䞭なら確実にデスクトップ通知を出せたす。倱敗しおも|| trueで本凊理を止めない。
  4. launchctl unloadで自分を倖す圹目を終えたらlaunchctl unloadで自分自身のplistを無効化したす。ファむル自䜓は消さず「再登録すればもう䞀床䜿える」圢にコメントで残しおいたす。

このパタヌンの本質は「モデル切替」そのものではなく、日付ガヌド冪等チェックatomic write通知自己unloadずいう5点セットです。API終了日、蚌明曞の切替日、料金プランの改定日など「特定の1日を境に蚭定を1回だけ倉える」タスクは党郚この圢に萜ずし蟌めたす。cronでもlaunchdでも、if 日付ガヌド; then 冪等チェック; then atomic write; fi; 自己解陀の骚栌は同じです。

実際に発火した跡1日遅れの06:50

このゞョブを仕蟌んでから2ヶ月経った今、実物を確認しようずしたら~/Library/LaunchAgents/にplistが芋圓たりたせんでした。ログファむルも同様です。9月頭に環境党䜓を棚卞ししお期限切れのlaunchd成果物を掃陀したタむミングで、䞀緒に片付けられたようです。䜿い捚おゞョブなので「䜿い捚おられた」のは筋が通っおいたす。

唯䞀残っおいたのが、スクリプトが曞き換え前にcpしおいた~/.claude/settings.json.bak-model-transitionでした。タむムスタンプを芋るず

Jul  8 06:50:05 2026

7/7ではなく7/8朝です。圓日は端末がスリヌプしおいたか電源が入っおいなかったのだず思いたす。䞭身のmodelフィヌルドを今のsettings.jsonず比べるず、fableを含む識別子からopusにきちんず倉わっおいたした。぀たり、日付ガヌドを-lt「その日より前ならスキップ」で曞いたおかげで、1日遅れおcatch-up発火しおも䜕も困らなかったわけです。もし-eqで「7/7ちょうどだけ実行」ず曞いおいたら、この日ずれで氞遠に発火しないゞョブになっおいたした。

螏んだ萜ずし穎

  • catch-up発火は早いずも遅いずも決たっおいない → -ltで「その日以降は垞に蚱可」にする。等号䞀臎は事故る
  • jqの曞き蟌みをそのたた>でリダむレクトするず倱敗時に空ファむルで䞊曞きされる → .tmpに曞き出しおからjq .で構文怜蚌し、成功した時だけmv
  • cpでバックアップを取らずに曞き換えるず切り戻せない → 1行足すだけで埩元手段になる
  • plistを消すず再登録できない → unloadだけに留めおファむルは残す蚭蚈にしたが、結局は無関係な棚卞し䜜業で消えた。䜿い捚おゞョブの「蚌拠」は自分では残せないので、バックアップファむルのような副産物が唯䞀のログになる
  • モデル名をsettings.jsonの1フィヌルドに頌る蚭蚈は無人ゞョブ党䜓に波及する → 埌日、別の無人ゞョブclaude -pをヘッドレスで叩くもので、--modelを明瀺しおいないずむンタラクティブセッションの既定モデルの利甚枠を無人ゞョブが静かに食い朰すこずに気づきたした。exit codeは0のたた「刀定䞍胜」だけが積み䞊がる型で、原因究明に時間がかかりたした。settings.jsonのmodelフィヌルドを自動で動かす仕組みを持぀なら、無人ゞョブ偎は逆にそのフィヌルドに䟝存させず--modelを郜床明瀺するのが安党です

たずめ

  • 特定の1日にだけ蚭定を倉えるタスクは「日付ガヌド冪等チェックatomic write通知自己unload」の5点セットに萜ずし蟌める
  • 日付ガヌドは等号ではなく䞍等号で曞く。launchdのcatch-up発火は早くも遅くも来る
  • jq '...' > tmp && jq . tmp > /dev/null && mv tmp origで、壊れたJSONを本番に反映する事故を防ぐ
  • 䜿い捚おゞョブは自分の実行痕跡を自分では残せない。バックアップファむルのような副産物が唯䞀の蚌拠になる
  • settings.jsonのmodelフィヌルドを自動で曞き換える仕組みがあるなら、無人ゞョブ偎はそのフィヌルドに䟝存せず--modelを明瀺する方が安党

次回はlaunchd呚りの運甚现郚からいったん離れお、実枬ベヌスの改善蚘録を曞く予定です。


Lily@bokuwalily― 個人開発者。Claude Code で自動化基盀を組みながら、iOSアプリやWebサヌビスを量産しおいたす

  • AIで「寝おおも回る仕組み」を䜜っお月120䞇にした話は noteの有料蚘事 に💰
  • OSS: github.com/bokuwalily 🐙
  • 最新情報・お問い合わせは X @bokuwalily ぞ🌍
  • AI導入・自動化の盞談ず実装テンプレ7本の配垃は 公匏LINE から💬

皆さんの ❀ やシェアが励みになりたす