◉CLAUDE LABEN
●2.1.302 — fork サブエージェントが claude -p・Agent SDK・デスクトップで既定オンになりました。無効化は CLAUDE_CODE_FORK_SUBAGENT=0(10/16)●2.1.299 — 200K トークン超で約54分放置した会話はアイドル圧縮。MCP の許可ルールは名指ししたサーバーだけに一致します●SONNET 4.5 — Claude API での提供終了は 11/30、残り43日。移行先は Sonnet 5.5●WINDOWS — 日本語の環境でだけフックが黙って壊れる報告があり、文字コードの確認が呼びかけられています●FAST MODE — Opus 5.5 の Fast mode がリサーチプレビューを終え、ベータヘッダーが不要になりました(10/15)●NEW — Cowork に渡したフォルダの先頭に、十行の約束ファイルを置いてみました●2.1.302 — fork サブエージェントが claude -p・Agent SDK・デスクトップで既定オンになりました。無効化は CLAUDE_CODE_FORK_SUBAGENT=0(10/16)●2.1.299 — 200K トークン超で約54分放置した会話はアイドル圧縮。MCP の許可ルールは名指ししたサーバーだけに一致します●SONNET 4.5 — Claude API での提供終了は 11/30、残り43日。移行先は Sonnet 5.5●WINDOWS — 日本語の環境でだけフックが黙って壊れる報告があり、文字コードの確認が呼びかけられています●FAST MODE — Opus 5.5 の Fast mode がリサーチプレビューを終え、ベータヘッダーが不要になりました(10/15)●NEW — Cowork に渡したフォルダの先頭に、十行の約束ファイルを置いてみました
記事一覧/API & SDK
⬡ API & SDK/2026-10-17中級

定期タスクの冒頭で WS が空になった朝、シェルが二つあることを知りました

定期タスクの手順1で作業フォルダの変数が空になりました。原因はシェルが二つあることでした。両方で同じ検査を走らせた結果と、tool_result で取り違えを止める実装をお伝えします。

Messages APItool_resultCowork50スケジュールタスク28運用実録

✦ プレミアム記事

土曜の夕方、個人開発で動かしている定期タスクの手順1を実行しました。作業フォルダの場所を変数 WS に入れる、いつもの一行です。

返ってきたのは、空文字でした。エラーは一行も出ておりません。終了コードも 0 です。

たまたま私は変数の中身を echo で確かめる癖があり、その場で気づけました。もし確かめていなければ、次の手順の cat "${WS}/_skills/…" が「そのようなファイルはありません」と答えたはずです。——ただしそのメッセージが指すのは、本当の原因ではなく、ルート直下のパスでした。

この記事は、その朝に分かったことの記録です。エージェントのシェルが二つあるとき、取り違えは「失敗」ではなく「空」として現れます。 空を失敗に変える手当てを、実際に動かした結果とあわせてお伝えします。

手順1の変数が空のまま、先へ進みかけました

起きたことは単純です。定期タスクの手順は「bash で作業フォルダを探し、設定ファイルを読む」という書き出しで始まっておりました。私が最初に呼んだのは、クラウド側で動く標準の bash ツールです。

ところが、この実行環境にはシェルが二つあります。クラウド側の bash と、端末側の仮想マシンで動くシェルです。作業フォルダがつながっているのは、端末側だけでした。

クラウド側で探すと、ls -d は何も見つけられません。それでも 2>/dev/null | head -1 が末尾に付いているため、見つからなかったという事実は、そのまま空文字になって流れていきます。

この構成の怖さは、間違ったシェルでも、ほとんどのコマンドが普通に動く ことにあります。次の節で、二つを並べた結果を示します。

二つのシェルは「ほぼ同じ」に見えて、見えるものが違いました

同じ検査スクリプトを両方のシェルで実行して、結果を並べました。スクリプトは次の通りです。作業フォルダ名は伏せて Workspace と書き換えておりますが、検証では実際のフォルダ名で実行しました。

#!/bin/bash
# probe.sh — シェルの素性を洗い出す。二つのシェルで同じものを実行する
echo "host=$(hostname)"; echo "home=$HOME"; echo "pwd=$(pwd)"
echo "sessions_dir=$([ -d /sessions ] && echo yes || echo no)"
echo "ws_glob=[$(ls -d /sessions/*/mnt/Workspace 2>/dev/null | head -1)]"
echo "git=$(git --version 2>&1)"; echo "node=$(node -v 2>&1)"; echo "py=$(python3 --version 2>&1)"
s=$(date +%s%N)
curl -s -o /dev/null -m 10 -w 'github_api=%{http_code}' https://api.github.com/zen
echo " ($(( ($(date +%s%N)-s)/1000000 ))ms)"

結果は次の表のとおりです。

項目クラウド側のシェル端末側のシェル
ホスト名vmclaude
Python3.13.163.10.12
git2.43.02.34.1
Node.jsv22.22.0v22.23.2
/sessions ディレクトリありませんあります
作業フォルダ見つかりません(空文字)見つかります
api.github.com/zen への curl403(1,352 ms)200(98 ms)

git も Python も Node も、どちらでも動きます。違うのは、バージョンと、見えるフォルダと、外への通信の通り方でした。

通信の 403 について、理由までは調べておりません。認証なしの素の curl が通らなかったという観測だけを、そのまま書き残します。外への通信が静かに止まる話は、スケジュールタスクが SUCCEEDED のまま成果を出さなくなったら、最初の1分で外への通信を疑いますに別途まとめました。

もう一つ、地味に効いてくるのが Python の版です。クラウド側は 3.13、端末側は 3.10 でした。同じスクリプトでも、書き方によっては片方でしか動きません。

✦

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

この記事の続きを読む

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

この記事で得られること
✦自分のエージェントのツール定義に「どのファイルが見えるシェルか」を書き込み、取り違えを実行前に止められるようになる
✦終了コード 0 のまま空文字が返る失敗を、tool_result の is_error で検知できるようになる
✦パス変数が空のまま `/` 直下を触る事故を、書き始める前の一行で未然に防げるようになる
Stripe による安全な決済 · いつでもキャンセル可能
✦

この記事を購入する

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

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

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

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

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

関連記事

◈ Cowork2026-10-18
前読みを head -150 で切っていた朝、読んだ 15.6KB のうち最新日は 3.3KB でした
日次メモの前読みを head -150 にしていた定期タスクで、行数は予算にならないと分かりました。日付ブロック単位で読む小さなリーダーと、切るときに消えやすい「まだ使っていない案」の守り方をお伝えします。
◈ Cowork2026-10-17
スケジュールタスクが SUCCEEDED のまま成果を出さなくなったら、最初の1分で外への通信を疑います
実行記録は緑なのに成果物が昨日のまま。外部への通信が CONNECT の 403 で止まっていないかを、短いプローブと鮮度チェックで最初の1分に見分ける手順をお伝えします。
◈ Cowork2026-10-01
定期タスクの手順書を削る前に、その一冊が何回読み直されるかを数えました
前読みの手順書を13KB削った見積もりは、再読込で数え直すと呼び出し約1.3回ぶんでした。削る前に何回読み直されるかを数える台帳と、実行中に読み込み量を残す関数をお伝えします。