まずはこれで判断する
| ユースケース | 推奨 | 理由 |
|---|---|---|
| 30 分ごとに受信トレイを確認する | Heartbeat | 他のチェックとまとめて実行でき、コンテキストも使える |
| 毎日午前 9 時ちょうどにレポートを送る | Cron(isolated) | 正確な時刻指定が必要 |
| 予定が近いカレンダーイベントを監視する | Heartbeat | 定期的な状況把握に自然に適している |
| 毎週の詳細分析を実行する | Cron(isolated) | 単独タスクで、別モデルも使える |
| 20 分後にリマインドする | Cron(main, --at) | 正確な時刻でのワンショット実行に向いている |
| プロジェクト状態のバックグラウンド確認 | Heartbeat | 既存のサイクルに相乗りできる |
Heartbeat: 定期的な状況確認
Heartbeat は一定間隔(デフォルト: 30 分)でメインセッション内で実行されます。エージェントが状況を確認し、重要なものだけを表に出すための仕組みです。Heartbeat が向いている場面
- 複数の定期チェック: 受信トレイ、カレンダー、天気、通知、プロジェクト状況を 5 つの別々の cron ジョブで監視する代わりに、1 つの heartbeat でまとめて処理できます。
- コンテキストを踏まえた判断: エージェントはメインセッションの完全なコンテキストを持っているため、何が急ぎで何が後回しでよいかを賢く判断できます。
- 会話の連続性: Heartbeat 実行は同じセッションを共有するため、エージェントは最近の会話を覚えており、自然にフォローアップできます。
- 低オーバーヘッドな監視: 1 つの heartbeat で、多数の小さなポーリングタスクを置き換えられます。
Heartbeat の利点
- 複数チェックをまとめて実行: 1 回のエージェントターンで、受信トレイ、カレンダー、通知をまとめて確認できます。
- API 呼び出しを削減: heartbeat 1 回の方が、独立した cron ジョブを 5 本動かすより安価です。
- コンテキストを考慮できる: いま何に取り組んでいるかをエージェントが理解しており、優先度を判断できます。
- 賢い抑制: 注意すべきことが何もなければ、エージェントは
HEARTBEAT_OKを返し、メッセージは配信されません。 - 自然なタイミング: キューの負荷に応じて多少ずれますが、多くの監視用途では問題ありません。
Heartbeat の例: HEARTBEAT.md のチェックリスト
Heartbeat の設定例
Cron: 正確な時刻での実行
Cron ジョブは正確な時刻に実行され、メインコンテキストに影響を与えない独立セッションでも実行できます。 毎時ちょうどの繰り返しスケジュールは、自動的にジョブごとの決定論的なオフセットで 0〜5 分の範囲に分散されます。Cron が向いている場面
- 正確な時刻が必要: 「毎週月曜の午前 9:00 に送る」のように、「9 時前後」でなく正確な実行時刻が必要な場合。
- 単独タスク: 会話コンテキストを必要としないタスク。
- 異なるモデル / thinking: より高性能なモデルを使う価値がある重い分析。
- ワンショットのリマインダー:
--atを使った「20 分後に知らせて」。 - 頻繁でノイズが多いタスク: メインセッションの履歴を散らかしたくないタスク。
- 外部トリガー: エージェントがほかに動いているかどうかに関係なく、独立して実行されるべきタスク。
Cron の利点
- 正確な時刻指定: タイムゾーン対応の 5 フィールドまたは 6 フィールド(秒付き)の cron 式を使えます。
- 負荷分散を内蔵: 毎時ちょうどの繰り返しスケジュールは、デフォルトで最大 5 分ずらして実行されます。
- ジョブ単位の制御:
--stagger <duration>で分散を上書きするか、--exactで厳密な時刻実行を強制できます。 - セッション分離:
cron:<jobId>で実行され、メイン履歴を汚しません。 - モデルの上書き: ジョブごとに、より安価なモデルや高性能なモデルを指定できます。
- 配信制御: 独立ジョブのデフォルトは
announce(要約配信)で、必要に応じてnoneも選べます。 - 即時配信: announce モードでは heartbeat を待たずに直接投稿されます。
- エージェントのコンテキストが不要: メインセッションがアイドル状態でも compact 済みでも実行できます。
- ワンショット対応:
--atで将来の正確な時刻を指定できます。
Cron の例: 毎朝のブリーフィング
Cron の例: ワンショットのリマインダー
判断フローチャート
両方を組み合わせる
最も効率的な構成は、両方を併用することです。- Heartbeat は、受信トレイ、カレンダー、通知などの日常的な監視を、30 分ごとに 1 回のバッチ処理で行います。
- Cron は、毎日のレポートや週次レビューのような正確なスケジュールと、ワンショットのリマインダーを担当します。
例: 効率的な自動化構成
HEARTBEAT.md(30 分ごとに確認):
Lobster: 承認付きの決定論的ワークフロー
Lobster は、決定論的な実行と明示的な承認が必要な複数ステップのツールパイプライン向けのワークフローランタイムです。 タスクが単一のエージェントターンで終わらず、人間のチェックポイントを挟める再開可能なワークフローが必要な場合に使います。Lobster が適している場面
- 複数ステップの自動化: 単発プロンプトではなく、ツール呼び出しの固定パイプラインが必要。
- 承認ゲート: 副作用を伴う処理を一時停止し、承認後に再開したい。
- 再開可能な実行: 以前のステップをやり直さず、一時停止したワークフローを続行したい。
Heartbeat / cron との関係
- Heartbeat / cron は、実行が いつ 起きるかを決めます。
- Lobster は、実行開始後に どの手順 を踏むかを定義します。
運用上のメモ(コードベース準拠)
- Lobster はツールモードでローカルサブプロセス(
lobsterCLI)として実行され、JSON エンベロープを返します。 - ツールが
needs_approvalを返した場合は、resumeTokenとapproveフラグを使って再開します。 - このツールはオプションのプラグインであり、
tools.alsoAllow: ["lobster"]で追加的に有効化します(推奨)。 - Lobster を使うには、
lobsterCLI がPATH上に存在している必要があります。
メインセッションと独立セッション
Heartbeat と cron はどちらもメインセッションと連携できますが、その方法は異なります。| Heartbeat | Cron (main) | Cron (isolated) | |
|---|---|---|---|
| セッション | Main | Main(system event 経由) | cron:<jobId> |
| 履歴 | 共有 | 共有 | 実行ごとに新規 |
| コンテキスト | 完全 | 完全 | なし(クリーン開始) |
| モデル | メインセッションのモデル | メインセッションのモデル | 上書き可能 |
| 出力 | HEARTBEAT_OK でなければ配信 | Heartbeat prompt + event | 要約を配信(既定) |
メインセッション cron を使う場面
次のような場合は、--session main と --system-event を使います。
- リマインダーやイベントをメインセッションのコンテキストに表示したい
- エージェントに次の heartbeat で完全なコンテキストを使って処理させたい
- 別の独立実行は不要
独立 cron を使う場面
次のような場合は、--session isolated を使います。
- 事前コンテキストなしのクリーンな状態で始めたい
- 異なるモデルや thinking 設定を使いたい
- 要約をチャンネルに直接 announce したい
- メインセッションを履歴で埋めたくない
コストに関する考慮点
| 仕組み | コスト特性 |
|---|---|
| Heartbeat | N 分ごとに 1 ターン。HEARTBEAT.md の大きさに応じて増加 |
| Cron (main) | 次の heartbeat にイベントを追加する(独立ターンなし) |
| Cron (isolated) | ジョブごとに完全なエージェントターン。安価なモデルも使える |
- トークンオーバーヘッドを抑えるため、
HEARTBEAT.mdは小さく保ってください。 - 似たチェックは複数の cron ジョブに分けず、heartbeat にまとめてください。
- 内部処理だけが必要なら、heartbeat で
target: "none"を使ってください。 - 定常タスクには、より安価なモデルを指定した独立 cron を使ってください。