Claude Codeに37時間の「実行中」。作業は終わり、見張り役が残っていた

10月10日の昼、Claude Codeに聞いた。

今実行してるやつは何? キャンセルしてもいいよ

Claudeは、記事の表示確認に使っていたプレビュー用のサーバーを止めて、こう答えた。

Codexの処理など、ほかに動いているものはありません。

その画面の右側を、スクショで送り返した。

Claude Codeデスクトップアプリのバックグラウンドタスク欄。「実行中」に2件。「骨組みレビューの結果を待って読む」Bash 37h42m35s、「Codex 2件の終了を待つ」Bash 37h30m25s、まだ出力がありません。完了8件

「実行中」が2件。37時間42分と、37時間30分。

Codexの作業は、37時間前に終わっていた

2件の正体は、Claudeが作った「見張り役」だった。

このとき私は、Claudeに記事を書かせ、その下書きのレビューと図版づくりを、別のAIのCodexに頼ませていた(そのとき書いていたのがShopifyアフィリエイトの申請記録だ)。Codexの作業が終わるのを待つために、Claudeは「Codexがまだ動いているかを、10秒か15秒おきに調べる」だけの処理を走らせていた。それが見張り役だ。Codexがいなくなれば、見張り役も終わるはずだった。

時刻 起きたこと
10月9日 0:14ごろ 1つ目の見張り役「骨組みレビューの結果を待って読む」が動き出す
0:25 1つ目が待っていたCodexのレビューが終わる
0:36 2つ目の見張り役「Codex 2件の終了を待つ」が動き出す
0:41 2つ目が待っていたCodexの作業(本文レビューと図版)も終わる
10月10日 14:07 画面の表示は37h42m35sと37h30m25s

Codexの仕事は、10月9日の0時41分にはすべて終わっていた。残っていたのは、その終了を待つ見張り役の2つだけだった。

37時間というのは、画面の経過時間の表示だ。37時間ずっと何かを処理していたわけではない。見張り役は、調べては眠るのを繰り返していただけで、それ以外のことはしていない。

画面の時刻にも、1つ確かめたことがある。2つの表示の差は12分10秒だった。これは、2つの見張り役がそれぞれバックグラウンド(裏側)に移った時刻、0時24分44秒と0時36分54秒の差と一致した。画面の経過時間は、処理が裏側に移った時点から数えているようだ。0時24分44秒に37時間42分35秒を足すと、10月10日の14時07分になる。スクショの時計と合う。

Claudeの報告と、実際の状態

この2件について、Claudeとのやり取りはこう進んでいた。

私が言ったこと Claudeの返事(要旨) 実際
終わったら教えて 終わったら知らせる 知らせは来なかった
今は何に時間かかってるの? Codexの作業は2つとも、もう終わっていた。終わったという知らせが届かず、気づくのが遅れた Codexは終わっていた。見張り役は2つとも動き続けていた
今実行してるやつは何? 動いていたのはプレビュー用サーバーだけ。ほかに動いているものはない 見張り役が2つ、37時間動いていた
(スクショを送って)止まってる? 2つを止めた —

2行目の返事は、間違いとは言い切れない。Codexの作業は本当に終わっていて、知らせも実際に届いていなかった。ただこのとき、見張り役が動き続けていることには、Claudeも私も気づいていなかった。

3行目の「ほかに動いているものはありません」は、はっきり間違いだった。

私はコードを読まない(その理由とやり方はAIが書いたコードを読まない話に書いた)。今回もコードは読んでいない。見ていたのは、アプリの右側に出ている「実行中」の欄だけだ。

「自分自身を見間違えた」という説明は、実験で覆った

2件を止めたあと、Claudeは原因をこう説明した。

見張り役が「Codexがまだ動いている」と自分自身を見間違え、Codexが終わったあとも永遠に待ち続けていました。

同じ失敗を防ぐためのメモにも、そう書き残した。

この記事を書く前に、Claudeにこの説明を実験で確かめさせた。結果は違った。

今回の実験で確認できたこと

見張り役が「Codexがまだ動いているか」を調べるのに使っていたのは、pgrep というMacの命令だ。この命令は、Macでは自分自身と、自分を呼び出した親の処理を、最初から数えない仕様になっている。つまり、自分自身を見間違えることはない。

では何を見間違えたのか。Claudeに、同じ命令の見張り役を走らせて試させた。このとき、Codexは1つも動いていない。2つ同時の実験は元と同じ10秒と15秒の間隔で、1つだけの実験は1秒の間隔で行った。

試したこと 結果
見張り役を1つだけ走らせる(1秒間隔) すぐに終わった
見張り役を2つ同時に走らせる(10秒・15秒間隔) 45秒たっても、どちらも終わらなかった
2つのうち1つ目だけを止める 止めたのと同じ秒に、2つ目も終わった

見張り役は、Codexを探すときに「codex exec という文字を含む処理」を探していた。そして見張り役自身の中にも、codex exec という文字が入っている。自分自身は数えないが、もう1つの見張り役は数えてしまう。だから2つあると、お互いを「Codexがまだ動いている」と見なし合って、どちらも終われない。

見張り役が1つなら、Codexが終わると見張り役も終わる。2つあると、互いの中にある「codex exec」という文字を見つけて「まだ動いている」と判断し合い、どちらも終わらない。今回の実験では、1つ目を止めた同じ秒に2つ目も終わった

10月6日にも同じ形の見張り役を使っていたが、そのときは1つだけで、Codexが終わるとすぐに終わっていた。

最初の説明は、もっともらしかった。でも実験の一度目で崩れた。メモに残っていた誤った原因も、実験の結果に合わせて書き直した。

1つ目が残った理由は、まだ分からない

これで説明がつくのは、0時36分に2つ目ができてからの話だ。

1つ目が待っていたCodexのレビューは、0時25分に終わっていた。しかし、2つ目ができる0時36分まで、1つ目が残っていた理由はまだ分かっていない。

止めたこと、メモしたこと

2件はClaudeが止めた。止めたあとに確かめると、codex exec に一致する処理はもう残っていなかった。

次のために、Claudeのメモに残したのは2つだ。

1つ目は、この記事の骨組みをCodexにレビューさせるときに、さっそくこのやり方で試した。レビューが終わると、知らせがちゃんと届いた。ただ、試したのはまだ1回だけだ。これで同じことが二度と起きないとまでは言えない。

私が確かめる場所

AIに作業を任せていると、「ほかに動いているものはありません」「原因はこれです」という報告が返ってくる。今回は、その2つがどちらも実際と食い違っていた。Codexの作業が「終わった」という報告のほうは、正しかった。

私が見るのは2つだ。

AIの原稿に、答えていない事実が書き足されていた話では、原稿と私の答えを並べて照らし合わせた。今回照らし合わせた相手は、画面の「実行中」の表示だった。


補足:10月6日の「約10分」は、約8時間だった

これとは別の件だが、同じ週にもう1つ、Claudeの報告と実際がずれていた。10月6日、Claudeが呼び出したCodexは、追加の入力を待つ状態で止まっていた。私が「まだしてるの?」と聞いたとき、Claudeは「最初の約10分は、Codexが入力待ちのまま固まっていて何も進んでいませんでした」と説明した。あとでログの時刻を見ると、止まっていたのは10時台から18時24分までの約8時間だった。呼び出し方を直すと、作業は約6分で終わった。