◉CLAUDE LABEN
●2.1.301 — vim の % モーション、VS Code パネルでの LaTeX 数式表示、使用量上限待ちのリトライ監視の上限が入りました(10/15)●2.1.299 — 200K トークン超で約54分放置した会話はアイドル圧縮。MCP の許可ルールは名指ししたサーバーだけに一致します●SONNET 4.5 — Claude API での提供終了は 11/30、残り45日。移行先は Sonnet 5.5●WINDOWS — 日本語の環境でだけフックが黙って壊れる報告があり、文字コードの確認が呼びかけられています●FAST MODE — Opus 5.5 の Fast mode がリサーチプレビューを終え、ベータヘッダーが不要になりました(10/15)●NEW — Cowork に渡したフォルダの先頭に、十行の約束ファイルを置いてみました●2.1.301 — vim の % モーション、VS Code パネルでの LaTeX 数式表示、使用量上限待ちのリトライ監視の上限が入りました(10/15)●2.1.299 — 200K トークン超で約54分放置した会話はアイドル圧縮。MCP の許可ルールは名指ししたサーバーだけに一致します●SONNET 4.5 — Claude API での提供終了は 11/30、残り45日。移行先は Sonnet 5.5●WINDOWS — 日本語の環境でだけフックが黙って壊れる報告があり、文字コードの確認が呼びかけられています●FAST MODE — Opus 5.5 の Fast mode がリサーチプレビューを終え、ベータヘッダーが不要になりました(10/15)●NEW — Cowork に渡したフォルダの先頭に、十行の約束ファイルを置いてみました
記事一覧/API & SDK
⬡ API & SDK/2026-06-23上級

毎回まっさらな環境で目覚める無人エージェント — 最初の30秒に状態回復を設計する

スケジュール起動の無人エージェントは、毎回まっさらな使い捨て環境で目を覚まします。書き込めないはずのパス、まだ起動しきっていないファイルシステム、消えた作業ディレクトリ。最初の30秒に状態回復を織り込む設計を、実際の運用ログから具体的に書きました。

Claude Agent SDK13無人エージェント状態回復冪等性5運用設計28

✦ プレミアム記事

スケジュール起動のエージェントが目を覚ました朝、最初に返ってきたのは成功でも失敗でもなく、could not create work tree dir: Permission denied という一行でした。

昨日まで書けていたはずの /tmp/repos に、今日は書けない。

原因はすぐに分かりました。エージェントが動く計算環境は毎回作り直される使い捨てのもので、ディレクトリの所有者がたまたま別ユーザーに割り当たっていたのです。私自身、個人開発で4つのサイトの記事生成を無人で回していますが、この種の「環境が毎回ちがう」前提を甘く見ると、夜間のタスクは静かにゼロ本で終わります。

無人エージェントの信頼性は、賢い本処理ではなく、最初の30秒で決まります。本稿はその30秒、つまりコールドブート直後の起動と状態回復をどう設計するかという話です。

計算環境は使い捨て、状態は別の場所に置く

最初に頭を切り替える必要があるのは、「同じマシンが昨日の続きを覚えている」という素朴な期待を捨てることです。

スケジュール実行の多くは、実行のたびに新しいサンドボックスを立ち上げます。前回書いたファイルは消え、インストールしたパッケージも残らず、cwd も環境変数も引き継がれません。ここで頼れる状態は、計算環境の外にあるものだけです。

私の運用では、耐久する状態を次の三層に分けて考えています。

層置き場所役割
コード/成果物Git リモート記事の本体。push して初めて「やった」ことになる
参照データ・設定クラウド同期のワークスペース方針・キーワード・トークン。読み取り専用に近い扱い
実行履歴日付ごとのログファイル「今日もう何をしたか」を次回の自分に伝える唯一の手段

この三層がそろっていれば、サンドボックスは何度焼き払われても構いません。エージェントは毎回、外部の真実から自分の状態を組み立て直せます。逆に言えば、この三層のどれかをローカルの一時ディレクトリに頼った瞬間、その情報はコールドブートで失われます。

起動シーケンスを「防御的に」書く

本処理に入る前に、環境を整える短いシーケンスを必ず通します。ここを横着すると、後段の処理が無言で失敗します。

順番に意味があります。(1) ファイルシステムの起動を待つ、(2) 作業ディレクトリを動的に探す、(3) 書き込み可能な作業領域を確保する、(4) 認証情報を取り出す。この4つです。

#!/usr/bin/env bash
set -euo pipefail
 
# (1) マウントが整うまで待つ — コールドブート直後は数秒間ファイルが見えない
WS=""
for i in $(seq 1 10); do
  WS="$(ls -d /sessions/*/mnt/Workspace 2>/dev/null | head -1)"
  [ -n "$WS" ] && [ -d "$WS" ] && break
  sleep 3
done
[ -n "$WS" ] || { echo "FATAL: workspace not mounted after 30s"; exit 1; }
 
# (2) 作業ディレクトリの第一候補が書けるか確かめ、ダメなら $HOME へ退避
WORK_BASE="/tmp/repos"
if ! mkdir -p "$WORK_BASE/.probe" 2>/dev/null; then
  echo "WARN: $WORK_BASE not writable, falling back to \$HOME/repos"
  WORK_BASE="$HOME/repos"
  mkdir -p "$WORK_BASE"
fi
rmdir "$WORK_BASE/.probe" 2>/dev/null || true
 
# (3) 認証情報は環境変数ではなく同期ストレージから読む(再ブートで消えないため)
TOKEN="$(grep -A1 '^MySite' "$WS/_tokens/tokens.txt" | tail -1 | tr -d '[:space:]')"
[ -n "$TOKEN" ] || { echo "FATAL: token missing"; exit 1; }
 
echo "ready: WS=$WS WORK_BASE=$WORK_BASE"

ポイントは、/tmp が書けることを仮定しないことです。実際に小さなディレクトリを作ってみて、失敗したら静かに $HOME へ逃がします。今回のブート時に私が遭遇した Permission denied は、この .probe テストひとつで吸収できる種類のものでした。

ls -d /sessions/*/mnt/... のようにワイルドカードで探すのも意図的です。セッション名は実行ごとに変わるため、パスをハードコードすると次回には存在しないディレクトリを指してしまいます。動的探索は、環境が変わることへのいちばん安い保険です。

✦

ここまでお読みいただきありがとうございます。

この記事の続きを読む

この先には、実装コードやベンチマーク結果など、実務でお役に立てる内容をご用意しています。このサイトは広告を掲載しておらず、サーバーや開発にかかる費用はメンバーの皆様のご支援で成り立っています。もしお役に立てていましたら、ご支援いただけますと大変ありがたいです。

この記事で得られること
✦使い捨て環境を前提にした起動シーケンス(マウント検出・ブート待ち・作業ディレクトリの動的探索・フォールバックパス)を、コピーして使えるbashで提示します
✦「今日もう同じ処理をしたか」を耐久ストレージのログから判定する冪等ガードの実装と、重複を防ぐ二段照合のコードを示します
✦私自身が4サイトの自動運用で踏んだ、書き込み権限・クラウド同期ファイル・ブート遅延の3つの落とし穴と、その回避手順を運用知見として整理します
Stripe による安全な決済 · いつでもキャンセル可能
✦

この記事を購入する

この先の内容をすべてお読みいただけます。一度のご購入で、いつでも何度でもアクセスできます。このサイトは広告を掲載しておらず、皆さまのご支援がサーバー費用などの運営を支えています。

または
メンバーシップなら全記事が読み放題 →
シェア

お読みいただきありがとうございます

Claude Lab は広告なしで運営しており、サーバー費用などの運営コストはメンバーシップのご支援で賄っています。実装コード・ベンチマーク・本番設計パターンなど、実務でお役立ていただける記事を毎日更新しています。もし読んでよかったと感じていただけましたら、ぜひご覧ください。

  • ✦コピー&ペーストで使える実装コード付き
  • ✦毎日新しい上級ガイドを追加
  • ✦¥580/月 または ¥1,480 の永久アクセス
メンバーシップを見る →

関連記事

⬡ API & SDK2026-08-30
モデルIDを一括置換する前に、手元の CLI が抱えるカタログを引きます
新しい世代が出ると、前の世代のモデルIDが急に古く見えます。インストール済みの実行ファイルに埋め込まれたカタログを引き、一致・日付不一致・書式破損の三段に仕分けてから直す手順を、実測値とスクリプトつきでまとめました。
⬡ API & SDK2026-07-31
400文字だけ残したはずのツール出力が、1MB を握り続けていた
自作の MCP サーバーやツールラッパーで出力を切り詰めても、Node の sliced string は元の全文を握り続けます。境界が13文字であること、平坦化が効く書き方と効かない書き方、ヒープスナップショットから親を数える監査スクリプトまで、すべて実測して記録しました。
⬡ API & SDK2026-07-24
共通エージェント定義をセッション単位で使い分ける運用設計
Managed Agents で土台のエージェント定義を1つに畳み、バージョン固定とセッションローカルな上書きを使い分ける設計を、検証付きのコードと運用の落とし穴とともにまとめました。