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

スケジュールタスクが SUCCEEDED のまま成果を出さなくなったら、最初の1分で外への通信を疑います

実行記録は緑なのに成果物が昨日のまま。外部への通信が CONNECT の 403 で止まっていないかを、短いプローブと鮮度チェックで最初の1分に見分ける手順をお伝えします。

Cowork48スケジュールタスク26ネットワークトラブルシューティング52無人運用10

GitHub の Issue #93562 を読んだ夜、自分の定期タスクの実行一覧を開き直しました。どの行も SUCCEEDED で、赤い行は一つもありません。

それでも胸のあたりが落ち着きませんでした。報告されていた症状は——実行は成功と記録されるのに、成果物が何も生まれない——というものだったからです。

最初にお伝えしたいのは、実行一覧の色は、成果が出たことの証拠にならないという点です。外への通信が止まっていないかを最初の1分で見分けるプローブと、成果物の鮮度を別の目で見る小さなチェックを、以下に書き残します。

報告されていた症状

Issue の報告者は、毎日走らせていた定期タスク18本が、2026年9月11日からすべて成果を出さなくなったと書いています。スケジュールは発火し、記録は SUCCEEDED のまま。ただし各回の最初の外向き通信が、プロキシの CONNECT で 403 になっていたそうです。

設定は「ネットワーク通信を許可」かつ「ドメイン許可リスト: すべてのドメイン」でした。それでも許可リストの外のホストは通らず、デスクトップ側のローカル VM から試しても同じだった、と報告されています。同じスレッドには、同じ症状を確認したという声が複数並んでおります。

私が確認できたのは、ここまでです。原因が何か、いつ直るのかは、Issue の記述からは分かりません。取得した時点で、この Issue は open のままでした。

大事なのは原因の特定よりも、自分のタスクが同じ状態になったとき、何分で気づけるかのほうだと考えています。

最初の1分で見る、疎通プローブ

壁紙アプリの運用を定期タスクに任せるなら、最初の手順はたいてい外部の API やサイトへ出ていくことです。そこが塞がれると、後ろの手順はすべて空振りになります。ですから、タスクの冒頭で「出られるか」だけを先に確かめ、結果を必ず1行残すようにしました。

#!/usr/bin/env bash
# egress_probe.sh — 外部ホストへ出られるかを 1 行ずつ記録し、1 つでも塞がれていれば exit 1
# 使い方: ./egress_probe.sh https://api.github.com https://example.com
set -u
LOG="${PROBE_LOG:-./egress_probe.log}"
blocked=0
 
probe() {
  local url="$1" out code connect rc
  # %{http_connect} はプロキシが返した CONNECT の応答コード(直結なら 000)
  out=$(curl -sS -m 15 -o /dev/null -w '%{http_code} %{http_connect}' "$url" 2>&1)
  rc=$?
  code=${out%% *}; connect=${out##* }
  if [ "$rc" -eq 56 ] || [ "$connect" = "403" ]; then
    echo "BLOCKED(proxy) rc=$rc connect=$connect $url"; return 1
  elif [ "$rc" -eq 6 ]; then
    echo "NO-DNS rc=$rc $url"; return 1
  elif [ "$rc" -ne 0 ]; then
    echo "FAIL rc=$rc $url"; return 1
  fi
  echo "OK http=$code connect=$connect $url"
}
 
echo "== $(date -u +%FT%TZ) start (${#@} hosts)" >> "$LOG"
for u in "$@"; do
  line=$(probe "$u") || blocked=$((blocked+1))
  echo "$line" | tee -a "$LOG"
done
echo "== end blocked=$blocked" >> "$LOG"
[ "$blocked" -eq 0 ]

なぜこう書いたのかを3点だけ補います。

  • local の宣言と代入を別の行に分けているのは、rc=$? に curl の終了コードを残すためです。local out=$(curl ...) と一行で書きますと、$? には local 自身の結果(常に 0)が入り、56 も 6 も見えなくなります。
  • curl -w '%{http_connect}' を使うと、プロキシが返した CONNECT の応答コードが取れます。報告にあった CONNECT tunnel failed, response 403 は curl の終了コード 56 と対応しますから、この二つのどちらかを見れば「プロキシが止めた」と言い切れます。
  • 最後の [ "$blocked" -eq 0 ] で、一つでも塞がれていれば exit 1 を返します。タスクの指示文には「プローブが失敗したら、BLOCKED と書いて終わる。成果物を作ったふりをしない」と一文入れておきます。

結果の読み分け

プローブが返す行は、次の三つに分けて読んでいます。

行の頭意味最初にやること
BLOCKED(proxy)プロキシが CONNECT を拒否(終了コード 56 または connect=403)ネットワーク設定の許可リストと、Issue の最新状況を見る
NO-DNS名前が引けない(終了コード 6)ホスト名の綴りと、HTTP(S) 以外のポートを使っていないかを見る
FAIL / OK http=4xx・5xx通信は届いている。相手側の応答の問題相手サービスの障害か、認証の期限を見る

報告者は IMAP(ポート 993)が名前解決すらできなかったとも書いています。許可リストが効くのは CONNECT を使う HTTP(S) だけで、メールのポートや SSH は別の話になります。ここを取り違えますと、設定を「すべてのドメイン」に直したのに IMAP だけ動かない——という場面で、長く迷ってしまいます。

成果物の鮮度を、実行記録とは別に見る

プローブは「今日出られるか」しか教えてくれません。夜のうちに起きた失敗に朝気づくには、成果物の更新時刻を直接見るのが確実です。

#!/usr/bin/env bash
# check_fresh.sh — 成果物の更新時刻が古すぎないかを見る(実行記録の色は見ない)
# 使い方: ./check_fresh.sh <ファイル> [許容時間(時間)]   例: ./check_fresh.sh daily_report.md 26
f="${1:?file required}"; max_h="${2:-26}"
[ -e "$f" ] || { echo "MISSING $f"; exit 2; }
now=$(date +%s)
# GNU stat と BSD stat の両対応
mtime=$(stat -c %Y "$f" 2>/dev/null || stat -f %m "$f")
age_h=$(( (now - mtime) / 3600 ))
if [ "$age_h" -gt "$max_h" ]; then echo "STALE ${age_h}h > ${max_h}h $f"; exit 1; fi
echo "FRESH ${age_h}h $f"

許容時間を24時間ではなく26時間にしているのは、実行時刻が少しずれた日に誤報を出さないためです。手元で更新時刻を作り分けて動かしたところ、更新直後は FRESH 0h、40時間前のファイルは STALE 40h > 26h で終了コード 1、存在しないファイルは MISSING で終了コード 2 になりました。

終了コードを三通りに分けておくと、朝の確認が「赤い行があるか」から「どの種類の赤か」に変わります。

手元で測れたことと、測れなかったこと

2026年10月17日の午後、Cowork のローカル VM から7つのホストへプローブ相当の curl を打ちました。結果は次のとおりです。

ホスト応答
api.github.com200
raw.githubusercontent.com301
example.com200
news.google.com302
www.tagesschau.de200
code.claude.com302
platform.claude.com200

つまり私の環境では、報告にあるような 403 は再現しませんでした。connect の欄も 000 のままで、プロキシを経由した形跡は見えていません。存在しないホスト名には終了コード 6 が返り、NO-DNS の行が出ることだけを確かめられました。

ですから BLOCKED の行が実際にどう表示されるかは、Issue に載っているログ(curl: (56) CONNECT tunnel failed, response 403)に頼っております。ここは私の手元で見た光景ではない、と正直に書き添えておきます。

今日から置く1つ

定期タスクの冒頭に、プローブを1回だけ置いてみてください。ホストは、そのタスクがいちばん最初に呼ぶ1つか2つで十分です。

連携フォルダの扱いで詰まった経験は 連携フォルダに置いたロックが、二度目の無人実行を締め出すまで に、検査が落ちない形になっていた経験は 毒入りサンプルを置くまで、無人の検査は一度も落ちていませんでした に書き残しております。どちらも、緑の記録を疑い直す話です。

記録の色は参考に、朝いちばんに見るのは成果物の更新時刻。 この線引きだけは、外の仕組みがどう変わっても手放さないでおこうと、いまも感じています。

シェア

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

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

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

もしこの記事がお役に立ちましたら、チップ(¥150)で応援いただけると大変励みになります。広告なしでの運営を続けるため、皆さまのご支援が大きな力になっています。

関連記事

◈ Cowork2026-09-24
Cowork の定期タスクは、来週の土曜にも動きますか
一度で止まる定義、1本に詰めた二つの時刻、書き換えで空いた曜日。Cowork のスケジュールタスクは、ログに何も残さないまま欠けることがあります。定義を台帳に書き写し、意図と突き合わせる点検スクリプトを動くコードでまとめました。
◈ Cowork2026-08-29
連携フォルダに置いたロックが、二度目の無人実行を締め出すまで
クラウド同期の連携フォルダでは作成も改名も通るのに、削除だけが拒まれます。そこへ二重起動防止のロックを置いた結果、二度目以降の無人実行が永久に見送られました。三方式の実測と、ロックの置き場所を分ける実装をまとめます。
◈ Cowork2026-10-01
定期タスクの手順書を削る前に、その一冊が何回読み直されるかを数えました
前読みの手順書を13KB削った見積もりは、再読込で数え直すと呼び出し約1.3回ぶんでした。削る前に何回読み直されるかを数える台帳と、実行中に読み込み量を残す関数をお伝えします。