2026年9月4日 金曜日
AI時短ラボ
検証· 約12

Gooseの`/goal`コマンド──エージェントが「終わったつもり」で止まるのを、自己確認のループで防ぐ仕組み

オープンソースAIエージェントGoose(Block)がv1.46.0で追加した`/goal`コマンドは、ユーザーが指定した目標をエージェントに自己チェックさせてから応答を終わらせる機能。実装したPR本文によれば、無限ループを避けるためチェックの上限は3回に固定されている。8日後の別PRでは「/goalを設定した瞬間にターンを開始しない」バグも修正された。

Gooseの`/goal`コマンド──エージェントが「終わったつもり」で止まるのを、自己確認のループで防ぐ仕組み
執筆・編集:
目次

AIエージェントに作業を任せていて、「まだ終わっていないのに、エージェントが勝手に終わったつもりで応答を返してくる」という経験をしたことがある人は少なくないはずだ。Block社のオープンソースエージェント「Goose」は、v1.46.0(2026年8月12日公開)でこの問題に対する1つの答えを追加した。/goalコマンドだ。

3行まとめ

  • Gooseの/goalコマンドは、エージェントが「テキスト応答のみで終わろうとする」たびに目標達成を自己検証させ、満たしていなければ作業を継続させる。無限ループを避けるため、ナッジ(後押し)は3回を上限に固定
  • /goalを実装したPR #9069のコミット履歴を確認すると、同じPR内で「上限なしで際限なく促し続ける」/grindコマンドも同時に追加されていた。この/grind実装コミットは「Co-Authored-By: Claude Sonnet 4.6」という署名がついている
  • /grindmax_turnsに達するか/grind offが打たれるまで、ツール呼び出しの無い応答すべてに再ナッジをかけ続ける設計で、/goalの「3回で打ち切る」という安全装置を意図的に外した、より強い版だと公式コミットメッセージに明記されている

PR本文に書かれた開発の動機

この機能を実装したPR #9069(2026年5月20日マージ)の本文には、作者自身の言葉でこう書かれている。

"I found using goose just ... bare, I wanted to have it loop a little more when not around - giving it a goal to check on, a target."

(gooseをそのまま使うのは、なんというか……素っ気なさすぎると感じた。自分がその場にいない間、もう少しループを回してほしかった——チェックすべきゴール、目標を与えることで)

続けて機能の中身が説明されている。

"Add a /goal command that lets users set a goal the agent must verify before exiting its reply loop. When the agent would normally finish (text response, no tool calls), it instead injects a nudge message asking itself to verify the goal is met. If not met, it continues working. Capped at 3 goal-check nudges to prevent loops."

(ユーザーが目標を設定できる/goalコマンドを追加した。エージェントは応答ループを抜ける前に、その目標を検証しなければならない。エージェントが通常終了しようとする場面——テキスト応答のみでツール呼び出しが無い場合——では、代わりに「目標が満たされているか自己検証せよ」というナッジ(後押し)メッセージが差し込まれる。満たされていなければ作業を継続する。ループを防ぐため、ゴールチェックのナッジは3回を上限とする)

使い方は3パターン

PR本文にはコマンドの使い方も示されている。

/goal ensure all tests pass and code compiles
/goal             (show current goal)
/goal off         (clear the goal)

目標文を添えて/goal <説明>と打てば目標が設定され、引数無しの/goalだけなら現在の目標を表示、/goal offで目標を解除する。目標を設定した状態でエージェントが「もう終わった」と判断しそうになるたびに、Goose側から「本当に目標を満たしたか確認しろ」という自己チェックの指示が割り込む——という設計だ。

3回という上限は、目標が曖昧すぎて永遠に「満たしていない」と自己判定し続けるケース(無限ループ)を防ぐための安全装置になっている。

同じPRで追加されていた、上限なしの/grind

PR #9069のコミット履歴を確認すると、/goalと同じPRの中に、もう1つのコマンド/grindを追加するコミットが含まれている。コミットメッセージにはこう書かれている。

"feat: add /grind command for relentless goal pursuit without nudge cap … Like /goal but re-nudges the agent on every tool-free response with no pending-flag guard, so it keeps working until max_turns or /grind off."

(ナッジ上限なしで目標をしつこく追求する/grindコマンドを追加……/goalと似ているが、保留フラグによる歯止めなしに、ツール呼び出しの無い応答すべてに対して再度ナッジをかける。そのためmax_turnsに達するか/grind offが打たれるまで動き続ける)

このコミットには「Co-Authored-By: Claude Sonnet 4.6」という署名が付いている。つまりGoose自身の一部の実装コミットが、Claudeとの共同作業として記録されている。

コマンド ナッジの上限 終了条件
/goal 3回 3回チェックしても未達なら打ち切り、または目標達成
/grind 上限なし max_turns(最大ターン数)に達するか、ユーザーが/grind offを打つまで

(出典:PR #9069のコミットメッセージ・diff)

/goalが「曖昧な目標で無限ループしないための安全装置」を最初から持っているのに対し、/grindはその安全装置をあえて外した、より強力で使い方を選ぶコマンドだと分かる。

8日後に見つかった「設定しても動き出さない」バグ

/goalコマンドが追加された直後の挙動には、もう1つ見落としがあった。PR #9801(2026年6月18日マージ)の本文がそれを説明している。

"Setting a goal via /goal <desc> (or /grind <desc>) now immediately kicks off an agent turn instead of waiting for the next user prompt."

"Previously the assistant "Goal set" confirmation short-circuited the reply before entering the agent loop, so goal pursuit only began on the next user message. Now the set-with-description case records the confirmation (user-visible), injects an agent-visible kickoff with the goal text, and falls through into the reply loop where the existing goal-nudge logic drives the work."

/goal <説明>(または/grind <説明>)で目標を設定すると、次のユーザープロンプトを待たずに、即座にエージェントのターンが開始されるようになった。以前は、アシスタントの「Goal set(目標を設定しました)」という確認メッセージが、エージェントループに入る前に応答を打ち切ってしまっていたため、目標の追求は「次の」ユーザーメッセージが来るまで始まらなかった。今回、説明付きで設定するケースでは、ユーザーに見える確認メッセージを記録した上で、エージェントに見えるキックオフメッセージに目標のテキストを差し込み、応答ループへとそのまま進むようにした。これにより、既存のgoal-nudgeロジックが作業を駆動する)

つまり、/goal ensure all tests passとだけ打ってEnterを押しても、リリース当初の実装では「目標を設定しました」という表示だけが出て、実際にエージェントが動き出すのは次にユーザーが何か入力してからだった。これは/goalコマンドの直感的な使い方(設定したらすぐ動いてほしい)に反する挙動であり、6月18日のPRで修正された。目標を照会する/goal(引数無し)や解除する/goal offは、この修正後も引き続き即座に確認メッセージだけを返す(ターンを開始しない)仕様のままだ。

実際に手元で確認したこと

筆者はGooseを日常的に使っているわけではなく、/goalコマンド自体は手元では検証していない。ただし、この機能が対処しようとしている「エージェントがタスクを終えていないのに、テキストだけ返して止まってしまう」という現象自体は、Claude Codeなど普段使っているエージェントツールでも実際に何度も遭遇している。指示した検証手順の途中で止まっていたり、ビルドが通っていない状態で完了報告が返ってきたりする場面があり、そのたびに人間側が「本当に終わったか」を確認し直す必要が生じる。Gooseの/goalは、この確認作業の一部をエージェント自身の自己検証ループに肩代わりさせる試みだと理解しているが、実際にどの程度有効かは自分では試せていない。

似た仕組みとの違い

「エージェントに自己評価させてから終わらせる」という発想自体は、Goose特有のものではない。たとえばAnthropicのClaude Codeにも、作業計画をチェックリスト化して進捗を追跡する仕組みがある。ただしGooseの/goalは、あらかじめ計画をタスクに分解するのではなく、「エージェントが終わろうとするたびに、ユーザーが指定した1つの目標文と照らし合わせて自己検証する」という、よりシンプルな割り込み型の設計になっている点が特徴的だ。目標の妥当性判断自体をエージェント(LLM)に委ねているため、目標文の書き方が曖昧だと、3回の上限まで無駄にチェックを繰り返して終わる可能性もある。

3回という上限の根拠は書かれていなかった

/goalによるゴールチェックの自己検証が、実際のタスク完遂率をどの程度改善したかという定量評価は、リリースノートにもPR本文にも記載がなかった。また、3回という上限値がどのような検証・調整を経て決まったのかという経緯についても、今回確認した範囲の情報源には書かれていない。/grindコマンドについては、コミットメッセージから機能の違い(ナッジ上限なし)は判明したが、実際に/grindを使った際の挙動——たとえばmax_turnsの既定値がいくつなのか、際限なく促され続けることでコストがどれだけ増えるか——までは、今回確認した情報源の範囲では踏み込めていない。

関連記事

シェア: ポスト はてブ

出典・参照資料

AIニュースの解説を動画でも

YouTubeでは注目ニュースの背景を解説し、Xでは新着記事をお知らせしています。

コメント

まだコメントはありません。最初のコメントを書いてみませんか?

AIについて聞きたいことはありますか?

質問箱で無料で受け付けています。回答は公開され、他の方の参考にもなります。

質問箱を見る →

新しい記事をメールで受け取る

AIの新しい発表を、出典付きで整理して届けます。

関連記事