繰り返しのループ(/loop)
/loop は、プロンプト(やスラッシュコマンド)を今のセッションの中で決まった調子で流し直します。目覚めるたびに本物のエージェントのターンが動きます。Hermes はそのときの状態を新しく読み — 最新の CI の結果、今の待ち行列の深さ、たった今のファイルの中身を — 仕事をして、報告し、次の時間が来るまで静かにしています。
これは Claude Code の /loop(ここでも使える /proactive という別名も含めて)に対する Hermes なりの答えです。/goal が判定役に導かれる「この目的が達成されるまで働き続けて」であるのに対し、/loop は時計に導かれる「何かが止めろと言うまで、N 分ごとに(あるいはちょうどよい間合いで)これをまたやって」です。
どんなときに使うか
- 外の状態を見張る。 「デプロイ/CI の実行/待ち行列を見ていて、変わったら教えて」。これが本命の使い道です。
- 緑になるまで繰り返す。 「テストを走らせて、落ちたところを直して、通るまで繰り返して」。
- 作業中の見張り。 同じ会話で別のことをしながら、エラーの率や長い仕事の進み具合を気にかけておきます。
- 定期的な片づけ。 長いセッションの間、N 分ごとに lint をかけ直したり、状況をまとめ直したりします。
作業を人の手を離れて動かしたいとき — 夜通し、本物の予定表に沿って、端末を再起動しても生き残る形で — は、代わりに cron の仕事を使ってください。/loop はセッションの中に住み、cron はどのセッションの外にも住んでいます。そして、終わりの定義がはっきりした1つの目的が相手なら、たいていは /goal のほうが合います。
さっそく使う
/loop 5m check the deploy status and tell me if it's live yetこう見えます。
- ループが受け付けられる —
↻ Loop set (every 5m): check the deploy status… - 5分後に最初の目覚め — セッションが手空きの間に、Hermes が目覚めの合図を差し込み、そのときの状態に対して普通のターンを動かします。
- 繰り返し — 5分ごとに、止まる条件が満たされるか、あなたが止めるまで続きます。
スラッシュコマンドも同じ手軽さで繰り返せます。
/loop 10m /recap2つの間合いの決め方
決まった間隔 — あなたが時計を決める。 間隔(30s、5m、2h、1h30m)を渡すと、ループはその予定どおりに流れます。見ている相手が自分の都合で変わっていくときに使います。
/loop 2m poll the build at ci.example.com/job/42 and ping me the moment it finishes自分で間合いを取る — Hermes が時計を決める。 間隔を書かなければ、ループは自分で調子を取ります。下限(既定は1分)から始め、エージェントの返事が変わらない間は間隔を倍々に広げていきます。2分、4分、8分と伸び、上限(既定は15分)まで行きます。返事が前回と違った瞬間、間合いは下限に戻ります。変化の見分けは手元での要約の突き合わせなので(時刻は無視されます)、何も起きない待ち時間に余計な費用はかかりません。
/loop keep an eye on the migration and summarize progress目安はこうです。外の時計が仕事を動かすなら決まった間隔、仕事のほうが調子を作るなら自分で間合いを取る。
止まる条件
次のどれかが起きたとき、ループは終わります。
| 条件 | やり方 |
|---|---|
| エージェントが終わりと判断した | 目覚めのプロンプトが、仕事が終わったか意味をなさなくなったときに LOOP_COMPLETE だけの行で返事を締めるよう、エージェントに教えます。 |
| 実行の回数の上限 | --times N — N 回目覚めたら止まります。 |
| 証拠にもとづく条件 | --until <condition> — 目覚めるたびに、/goal を支えているのと同じ補助の判定役が、返事をあなたの条件に照らします(失敗しても止めない作りなので、判定役が壊れてもループが詰まることはありません)。 |
| あなた | /loop stop(残しておきたいなら /loop pause)。 |
| 歯止めの持ち分 | loops.max_ticks(既定100)がループを一時停止させるので、放っておかれたセッションがトークンを延々と使い続けることはありません。0 なら上限なしです。 |
例をいくつか。
/loop 2m poll CI --times 30
/loop 5m watch the queue --until queue depth reaches zeroコマンド
| コマンド | 働き |
|---|---|
/loop [interval] <prompt> [--times N] [--until <cond>] |
このセッションのループを始めます(すでにあれば置き換えます)。 |
/loop または /loop status |
間合い・目覚めた回数・次の目覚めまでの時間を表示します。 |
/loop pause |
ループを失わずに、流れるのだけ止めます。 |
/loop resume |
続きから動かします。 |
/loop stop |
ループを終わらせます。 |
/proactive … |
/loop の別名です(Claude Code に合わせてあります)。 |
CLI、画面付きの端末(hermes --tui)、Web の画面のチャット、デスクトップのアプリ、そしてすべての窓口(Telegram、Discord、Slack、WhatsApp、…)で動きます。メッセージのやり取りをする窓口では、あなたのメッセージの合間にも窓口が目覚めの合図を流します。ループはそのチャットのセッションのものなので、結果は普通の返事として届きます。
/goal と混ぜる
どちらも手空きの切れ目に人工のターンを差し込むので、1つの決まりに従います。動いている目標がセッションの主です。 /goal が実際に動かしている間(判定役が continue と言っている間)は、ループの目覚めが譲ります。目標が終わるか、一時停止するか、待ちの関門(/goal wait か、判定役の自動の WAIT の結論)で停まった時点で、ループが手空きの時間を使って再開します。停まった目標と /loop の組み合わせは自然です。目標が大きな非同期のものを待つ間、ループが別のものに目を配ります。
本物の利用者のメッセージは、そのどちらにも勝ちます。目覚めが流れるのは、セッションが手空きで、あなたのものが何も待っていないときだけです。
動きの細部
- 目覚めは普通の利用者役のターンです。 システムプロンプトの書き換えも道具立ての入れ替えもないので、プロンプトのキャッシュはそのまま生きています。
/resumeと圧縮をまたいで生き残ります。 ループの状態はセッションごとに保存され、文脈の圧縮の境目をまたいで運ばれます。/goalと同じです。- セッションにつきループは1つ。 新しく
/loopを立てると古いものが置き換わります。いくつも走らせたいなら、セッションをいくつも走らせてください(あるいは、たくさんの予定を回すなら cron を使います)。 - 目覚めのターンを Ctrl+C で止めるとループが一時停止します。
/loop resumeで戻せるので、取り消しがちゃんと取り消しとして働きます。 - トークンの費用は間合い次第です。 1回の目覚めがまるごと1ターンです。相手の状態が実際に変わる頻度に間隔を合わせてください。何も起きない待ちには自分で間合いを取らせるほうが向いています。
設定
# ~/.hermes/config.yaml
loops:
min_interval_seconds: 30 # floor for fixed intervals
max_ticks: 100 # backstop budget (0 = unlimited)
self_paced_floor_seconds: 60 # self-paced starting cadence
self_paced_ceiling_seconds: 900 # self-paced max backoff--until の判定役は goal_judge の補助の役目を通るので、auxiliary.goal_judge.* の上書き(提供元、モデル、max_tokens)はループの条件にもそのまま効きます。
/loop と /goal と cron
/loop |
/goal |
cron | |
|---|---|---|---|
| きっかけ | 時計(または自分で取る間合い) | 毎ターンのあとの判定役の結論 | 予定表。どのセッションの外にもあります |
| 住む場所 | 今のセッション | 今のセッション | 実行ごとの専用のセッション |
| 終わるとき | 止まる条件/上限/あなた | 目標の達成/持ち分/あなた | あなたが仕事を消したとき |
| 向いていること | 見張り、監視、定期の流し直し | 1つの目的を、終わるまで繰り返す | 人の手を離れた、長い時間軸の予定 |