◉ANTIGRAVITY LABEN
記事一覧/Agents & Manager
◈ Agents & Manager/2026-06-29上級

止まったまま生きているエージェントを見抜く — 進捗ハートビートとウォッチドッグの設計

プロセスは生きているのに6時間まったく進んでいない、という沈黙状態を見抜くために、進捗マーカーの外部化と無進捗タイムアウトによるウォッチドッグを設計しました。安全な止め方や導入の順序、夜間の記事生成エージェントで踏んだ落とし穴も共有します。

バックグラウンドエージェント3Antigravity376ウォッチドッグタイムアウト設計運用設計27

✦ プレミアム記事

朝、ダッシュボードは緑のままでした。プロセスは動いている、CPUもわずかに食っている、ログの最終行も「モデルに問い合わせ中」で止まっている——なのに、6時間前から1文字も先に進んでいませんでした。

私自身、個人開発で記事生成のエージェントを夜間に走らせています。その夜は外部APIの応答が返らず、リトライにも入らず、ただ待ち続けていました。プロセスは確かに生きていました。だから「生きているか」を見る監視は、ずっと緑を返し続けていたのです。問題は、生存と進捗を同じものとして扱っていたことでした。

「生きている」と「進んでいる」は別の問い

サーバ監視の習慣で、私たちはつい「プロセスが存在するか」「ポートが応答するか」を健全性の指標にします。短時間で終わるリクエストならそれで十分です。けれどバックグラウンドエージェントは、1回のジョブが数分から数十分かかり、その間ずっと「正常に存在しつつ、何も進めていない」状態になり得ます。

停滞の典型は、応答が返らない外部呼び出し、解けない依存関係を前にした無限の思考ループ、そして自分で自分を待つデッドロックです。どれもプロセスは生きています。生存監視(liveness)はこれらを一切捕まえられません。必要なのは**進捗監視(progress)**です。

監視の種類答える問い停滞を捕まえられるか
生存監視(プロセス存在・ポート応答)動いているか捕まえられない
ログ出力の有無何か喋っているか「待機中」を吐き続けると誤魔化される
進捗監視(前進した量)仕事が進んだか捕まえられる

ログを吐いているかどうかで判断するのも危険です。「待機中…」を出し続けるコードは、喋ってはいても進んでいません。見るべきは饒舌さではなく、前進した量です。

進捗をマーカーとして外に出す

進捗で見張るには、まずエージェント自身が「ここまで進んだ」を外部から観測できる形で残す必要があります。単調増加するステップ番号と、最後に前進した時刻を、共有できる場所へ書き出します。

# progress.py — 進捗マーカーを共有ファイルに刻む
import json, os, tempfile, time
 
def mark_progress(path: str, step: int, note: str = "") -> None:
    """step は単調増加。前進したときだけ呼ぶ(待機中には呼ばない)。"""
    payload = {"step": step, "note": note, "ts": int(time.time())}
    fd, tmp = tempfile.mkstemp(dir=os.path.dirname(path) or ".")
    with os.fdopen(fd, "w") as f:
        json.dump(payload, f)
    os.replace(tmp, path)        # 原子的に差し替え

ここで大事なのは、前進したときだけ mark_progress を呼ぶという規律です。ハートビートを「定期的に必ず打つ」設計にすると、停滞していても鼓動だけは続き、結局は生存監視に逆戻りします。鼓動は「生きている合図」ではなく「進んだ合図」でなければ意味がありません。

エージェント本体では、意味のある区切りごとにステップを進めます。

mark_progress(P, 1, "収集完了")
# ... 外部API呼び出し(ここが固まりやすい) ...
mark_progress(P, 2, "下書き生成")
# ... 整形 ...
mark_progress(P, 3, "検証通過")
✦

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

この記事の続きを読む

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

この記事で得られること
✦「生きているか」と「進んでいるか」はまったく別の問いだと理解でき、生存監視だけでは沈黙した停滞を見逃す理由が腑に落ちる
✦進捗ハートビート・無進捗タイムアウト・安全な強制終了までを通した完全な実装(Python のウォッチドッグと bash の組み込み例)。そのまま自分のジョブに差し込める
✦個人開発で夜間に走らせていたエージェントが朝まで無言で固まっていた実体験から、どこに進捗マーカーを刻むべきかの判断基準が得られる
Stripe による安全な決済 · いつでもキャンセル可能
✦

この記事を購入する

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

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

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

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

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

関連記事

◈ Agents & Manager2026-04-27
Antigravity を個人開発の「夜のもう1人」として迎え入れる運用モデル
Antigravity のエージェントを、個人開発者にとっての「夜のもう1人」として運用するための設計指針。タスクの渡し方・境界線の引き方・朝の3点確認をスクリプトにする方法まで、実際に運用して整えてきた手順を書き残します。
◈ Agents & Manager2026-04-23
Antigravity のブラウザエージェントをフレーキーにしない設計 — DOM 変化とタイミング問題を黙らせる実践
昨日まで通っていたブラウザエージェントのタスクが今日は転ぶ。再実行すると通ったり通らなかったり。Antigravity でブラウザエージェントを本番運用するうえで私が踏み抜いてきたフレーキー(不安定)な挙動の原因と、その設計レベルでの対処を実務目線で整理しました。
◈ Agents & Manager2026-09-09
Antigravity の Scheduled Tasks を組んでも走らないとき、sidecar.json と enabled を順に確かめます
Antigravity 2.0 の Scheduled Tasks が予定時刻に走らないときの切り分け手順です。sidecar.json の置き場所と ID、config.json の有効化、sidecar_data のログを順に確かめます。
📚RECOMMENDED BOOKS
大規模言語モデル入門
山田育矢
LLM開発
生成AIプロンプトエンジニアリング入門
我妻幸長
プロンプト
Claude CodeによるAI駆動開発入門
平川知秀
AI駆動開発
※ アフィリエイトリンクを含みます