0
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

長時間ループ型エージェント運転の配線チェックリスト:Claude Code 4時間55分のHyper-V構築と、Cursor 24hランナーの暗転から復旧まで

0
Posted at

Long-running agent loop wiring checklist

2026年6月8日、Microsoft MVPの胡田昌彦氏は「Claude Codeを5時間放置|AIに自律でインフラを作らせる時代」(動画9分36秒)で、Claude Code が約4時間55分かけて Nested Hyper-V ラボ(ebibibi/hyperv-nestlab)を自律構築した事例を公開した。プロンプト1発ではなく、長時間ループが前提だ。

同じ時期、筆者(ITPRODX)は Mac mini 上の launchd 15分間隔ランナー(~/Projects/ai-company-24h/runner.py)と朝便ランナー群(agent-skill-exec.sh 経由の cursor-agent --model auto)で「放置運転」を回している。2026年8月15日の Codex 上限到達を機に Cursor へ切り替えたが、エンジン配線の不整合と CLI のプロンプト渡し方で3日間、成果物ゼロの暗転が起きた。本稿は、胡田氏の公開事例と筆者の一次ログを対比し、長時間ループ型運転を回すための配線チェックリストを整理する。

結論

確認項目 胡田氏の公開事例(出典付き) ITPRODX実体験(2026-08-15〜18) 直すこと
実行モデル Claude Code が長時間ループで作業継続 cursor-agent --model auto に統一(Codex は明示切替のみ) ~/.config/itprodx/agent-engine と各 runner の実呼び出しを一致させる
成果の単位 YAML + bootstrap.ps1 で冪等なインフラ SAFEジョブ1本=下書き1ファイル(outputs/<date>/) DONE ログと成果物ファイルの両方で成功を判定する
停止原因 (動画・READMEは外部参照。ここでは断定しない) Codex 上限 → runner.py が Codex 固定 → No prompt provided for print mode エンジン切替時に 全ランナー をgrepで横断確認
人間の関与 AD参加後のライセンス認証など(README記載) Telegram 承認ゲート(公開・送信は人間✅のみ) 自律化してよい境界と、必ず止める境界を分離

胡田氏の hyperv-nestlab:長時間ループが効く条件

確認できる事実

  • 動画: Claude Codeを5時間放置|AIに自律でインフラを作らせる時代(2026-06-08公開、@ebibibi、9:36)
  • リポジトリ: ebibibi/hyperv-nestlab — 「宣言的・冪等な Nested Hyper-V ラボ構築基盤」
  • README 上の要点: 既存 Hyper-V ホスト1台に bootstrap.ps1 を実行すると、制御 VM(Ansible)を自己構築し、YAML 宣言から Nested ホストと VM 群を再現する
  • 完了判定に使える中間状態: README のチェックリスト(L0→L1 冪等プロビジョニング、L2 Windows/Ubuntu/AD など)が公開されている

実務解釈

胡田氏の事例で再現性が高いのは、「最終ゴール1文」ではなく 冪等な中間チェックポイント がある点だ。bootstrap.ps1 と YAML が「同じコマンドを再実行しても壊れない」形になっているため、エージェントが数時間ループしても状態が収束しやすい。

コーディングエージェントの長時間運転を自社インフラに載せるときも、同型の設計が必要になる。具体的には次の3点だ。

  1. 完了条件を機械判定できる形にする(例: pytest が exit 0、特定ファイルが生成される)
  2. 1ジョブのスコープを「1成果物」に切る(24hランナーなら shukyaku-qiita = Qiita下書き1本)
  3. ログに DONE / FAIL / 成果物パスを必ず残す(後から「動いていたが空回り」を検知する)

ITPRODX側:2026-08-15のエンジン切替と暗転

確認できる事実(HQ日報・runner.log・決定記録)

2026-08-15 07:30 — hq-morning-runner が Codex 使用量上限で exit=1(決定記録: 00_Codex_HQ/30_Decisions/2026-08-15-hq-morning-cursor-engine.md)

同日の方針:

  • 朝運転・日次ランナー群の正本エンジン = Cursor(agent-skill-exec.sh 経由)
  • モデル = auto 既定
  • Codex は switch-agent-engine.sh codex の明示切替時のみ

24hランナーの成果物本数(HQ日報 _token-meter):

日付 成果物本数 runner INVOCATION
2026-08-14 35 35
2026-08-15 0 48
2026-08-16 0 (日報上0本)
2026-08-17 0 113
2026-08-18 11 12

8/15〜8/17は launchd が 15分ごとに起動しているのに、SAFEジョブの DONE が成果物に結びつかない状態が続いた。runner.log では 8/15 0時台から exit=1 / RETRY / FAIL が連続している。

8/17 22:55以降 — runner.py を Cursor 経路(cursor-agent --model auto --trust)へ修正後、kickstart で DONE が復帰:

2026-08-17T22:55:07+09:00 DONE douga-safe-plan:2026-08-17T22 status=needs_human artifact=.../douga-safe-plan__2026-08-17T22.md
2026-08-17T23:27:00+09:00 DONE revenue-demand-radar:2026-08-17T23 status=done_draft artifact=.../revenue-demand-radar__2026-08-17T23.md

Qiita/Zenn writer の別系統障害 — agent-skill-exec.sh が cursor-agent -p に stdin パイプでプロンプトを渡しており、即死していた:

2026-08-16 07:05:05 launching cursor agent (model=auto, timeout=1200s) ...
Error: No prompt provided for print mode
2026-08-18 07:05:06 ...(同エラー)
2026-08-18 09:46:49 ...(修正後 kickstart)
Qiita下書き完了・承認待ち: Copilot StudioからPower Automateフローをアクションとして呼ぶ入門

2026-08-18 修正 — CLI 引数渡しへ変更(agent-skill-exec.sh 78行目付近):

# stdin 受取 → cursor-agent -p へ CLI 引数で渡す(-p は stdin 非対応・2026-08-18 修正)
"$agent_bin" -p --model "$cursor_model" --output-format text -f --trust \
  --workspace "$workspace" -- "$(< "$prompt_file")"

実務解釈

暗転の原因は「モデルが弱い」ではなく 配線の不整合 だった。

  1. 朝便だけ Cursor、24hだけ Codex 固定 — 上限に当たった瞬間、半分のパイプラインが止まる
  2. exit=0 でも中身が空 — No prompt provided for print mode は exit=0 で終わる日があり、watchdog が「起動した」と誤認しうる
  3. 成功判定がログだけ — 成果物ファイルが無いのに INVOCATION だけ増えると、運転している錯覚が起きる

胡田氏の hyperv-nestlab が長時間で回るのは、冪等な中間状態があるからだ。ITPRODX側も DONE ログ と outputs/<date>/ のファイル存在の両方を見ないと、同じ錯覚を起こす。

実装チェックリスト

  • エンジン切替時: grep -r 'codex\|cursor-agent' ~/Claude/automation ~/Projects/ai-company-24h で横断確認
  • ~/.config/itprodx/agent-engine の値と、各 runner の 実際の起動コマンド が一致しているか
  • cursor-agent -p にプロンプトを渡す経路は CLI引数 か(stdin パイプは非対応)
  • 成功判定: runner.log の DONE + 成果物パスの 両方 を日次で確認
  • 外向きアクション(公開・送信・デプロイ)はランナーから直接実行しない(Telegram 承認ゲート)
  • Mac sleep 設定(pmset)と caffeinate の組み合わせを就寝前に確認(sleep=1 設定は暗転リスク)
  • エンジン切替決定は 30_Decisions/ に残し、次回同じ轍を踏まない

失敗パターン

パターン1:エンジンは切り替えたが runner.py だけ古い → 対策: 切替当日に runner.py / plist / shell ラッパーを同一PR(または同一コミット)で更新。8/15〜8/17の0成果物はこの典型例。

パターン2:No prompt provided for print mode が exit=0 → 対策: ランナーログで stderr を grep し、stdout が空でも失敗扱いにする。agent-skill-exec.sh の stderr tail を監視対象に入れる。

パターン3:INVOCATION だけ増えて成果物が増えない → 対策: HQ日報の _token-meter(成果物本数)を朝一で見る。113 INVOCATION / 0 本(8/17)は異常信号。

パターン4:長時間ループに完了条件がない → 対策: 胡田氏事例のように、YAML/README/pytest 等で 機械判定可能な中間ゲート を先に書く。/goal や「続けて」頼みだけにしない。

参考リンク

この記事を書いた人✏️@YushiYamamoto
ITPRODX.com代表 / AIアーキテクト
Next.js / TypeScript / n8nを活用した自律型アーキテクチャ設計を専門としています。
問い合わせ対応の自動化や、AIエージェントの長時間運転の設計については itprodx.com からご相談ください。日々の検証ログは note でも発信しています。

0
0
1

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
0
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?