Claude Codeに長い作業を任せるときは、「ゴール」「結果の測り方」「どこまで粘るか」の3つを渡す。Claude Codeを作ったBoris Chernyさんが、これで「ほとんどのことはうまくいく」と書いています。Claude Codeでは、この3つを/goalの条件に書くと、条件を満たすまで、Claudeが自分で作業を続けます。

Borisさんの投稿は日本時間2026年10月11日6時04分、Paul Kinlanさんへの返信です。本記事はこの投稿と/goalの公式資料を同日に確認して書いています。/goalと結びつけるのは編集部の提案で、Borisさんの投稿に/goalは出てきません。編集部では、わざと遅いプログラムを0.05秒未満にする課題を/goalで渡し、Claude Codeが計測しながら書き換えて終えるまでを録画しました。

元資料:Boris Chernyさんの投稿(ゴール・測り方・どこまで粘るか)。2026年10月11日確認。

Borisさんが挙げた3つ

Borisさんは、返信先の投稿が話題にしていた種類の仕事について、Opus 4.8のころからClaudeのほうがBorisさん自身より上手にこなせるようになり、5.5世代のモデルでは「とても上手」になったと書いています。そのうえで、モデルに渡すのは次の3つだけだとしています。

ゴール(例:CIのp95を10分未満にする)、測り方(例:変更のたびに計測値を読む)、どこまで粘るか(例:終わるまで続ける、何週間かかってもよい)の3つを並べた図
長い作業を任せるときに渡す3つBoris Chernyさんの投稿の3点を図にしたものです。例はBorisさんが挙げたものを要約して訳しています。
編集部の説明図(Image 2.5生成)。画像はタップで原寸表示。
渡すものBorisさんの例ねらい
ゴール「CIにかかる時間を、95パーセンタイルで10分未満にする」何ができたら終わりかを、数字で決める
結果の測り方「変更のたびにBigQueryで時間を読む」Claudeが自分で良くなったかを確かめられるようにする
どこまで粘るか「終わるまで止めない。何週間も試すことになるかもしれない」途中でやめてよいか、続けるべきかを伝える

Borisさんは、Claudeに毎日の進み具合をグラフで見せてもらったり、結果を見られるページを作ってDMで送ってもらったりもしていると書いています。

Claude Codeでは/goalに3つを書く

/goalは、終わりの条件を決めると、条件を満たすまでClaudeが作業を続けるコマンドです。公式資料によると、1ターン終わるたびに、小さく速いモデルが会話を読んで「まだ」「達成」「無理」を判定します。「まだ」なら、その理由を手がかりにClaudeが次のターンに進みます。

公式資料は、うまく続く条件に共通する要素として3つを挙げています。下の表の右の列は、Borisさんの3つとの対応を編集部が並べたものです。

公式資料が挙げる3つ公式資料の例Borisさんの3つとの対応・編集部の見立て
測れる1つの終わりの状態テストの結果、ビルドの終了コード、ファイルの数、処理待ちの一覧が空になったことゴール
どう確かめるかの指定「npm testが0で終わる」「git statusに未コミットの変更がない」結果の測り方
途中で変えてはいけないもの「ほかのテストファイルは変えない」Borisさんの3つにはない

Borisさんの3つ目「どこまで粘るか」に近いのは、公式資料が別の段落で書いている「区切り」です。条件に「20ターンで止める」のような回数や時間を書くと、Claudeが毎ターン区切りに対する進み具合を報告し、判定するモデルがそれを読んで判断します。ただし向きは逆で、Borisさんの例は「終わるまで止めない」と長く続けさせる方向、公式の例は止める方向の書き方です。

注意したいのは、判定するモデルは自分でコマンドを動かしたりファイルを読んだりしないことです。会話にClaudeが出した結果だけで判断します。そのため「結果の測り方」を条件に書き、Claudeに毎回、計測した結果を会話へ出させるのが大切です。

  • 条件は4,000文字まで書けます。
  • /goalだけを打つと、条件・経過時間・判定したターン数・使ったトークン数・最後の判定理由を確認できます。
  • 途中でやめるときは/goal clearです。
  • /goalは許可の設定を変えません。手放しで回したい場合は、公式資料のとおり自動モードで使います。
  • claude -p "/goal …"のように、画面を開かない実行でも使えます。途中経過を見たい場合は--output-format stream-json --verboseを付けます。
  • 条件に書いた区切りは、判定するモデルが会話を読んで判断するものです。-pで動かすときに確実に止めたい場合は、公式資料にあるターン数の上限--max-turnsや、費用の目安の上限--max-budget-usdも付けておくと安心です。

編集部で試した:遅いプログラムを0.05秒未満に

2026年10月11日、10万以下の素数を数えるプログラムprimes.pyを、わざと遅い書き方で用意しました。bench.pyは答えが9,592かどうかと、かかった時間を表示します。/goalの条件には、Borisさんの3つを次のように書きました。

  • ゴール:python3 bench.pyの出力が「判定: OK」で、計測時間が0.05秒未満
  • 測り方:primes.pyを変えるたびにbench.pyを実行して、出力をそのまま示す
  • 守ること:変えてよいのはprimes.pyだけで、bench.pyは変えない

モデルはOpus 5.5です。Bash・Read・Edit・Writeのツールは、確認なしで使えるよう事前に許可しました。画面は、Claude Code CLIをclaude -pで実際に動かし、その出力をそのまま映した編集部の確認用の画面です。Claude Codeのターミナル画面そのものではありません。

検証コンソールの最初の画面。claude --versionの結果と、primes.pyとbench.pyの中身
①起動確認と準備したファイル①claude --versionで2.1.296を確認。②わざと遅く書いたprimes.pyと、答えと時間を測るbench.pyを用意しました。
実操作のスクリーンショット(赤枠・番号のみ後付け)。画像はタップで原寸表示。
/goalから始まる依頼文を入力欄に入れた画面
②/goalで3つを渡す①入力欄に/goalで、ゴール(判定OKで0.05秒未満)・測り方(変えるたびにbench.pyを実行)・守ること(bench.pyは変えない)を書きました。②実行ボタンで起動します。
実操作のスクリーンショット(赤枠・番号のみ後付け)。画像はタップで原寸表示。
実行中のログ。Opus 5.5で開始し、Goal setのあと、bench.pyの計測を実行しようとしている
③実行中:ゴールを受け取って計測から始める①実行中の表示。②Claudeが「Goal set」とゴールを受け取り、まずファイルを読んでbench.pyで今の時間を測ろうとしています。
実操作のスクリーンショット(赤枠・番号のみ後付け)。画像はタップで原寸表示。
結果の画面。目標を達成した報告と、bench.pyの再実行結果とハッシュ
④結果:1回の書き換えで0.05秒未満に①Claudeは最初の計測(7.965秒)の後、primes.pyをエラトステネスの篩に書き換え、判定OKのまま0.000秒になったと報告。②確認欄でもbench.pyを実行し直し、bench.py自体は変わっていないことをSHA-256で確かめました。
実操作のスクリーンショット(赤枠・番号のみ後付け)。画像はタップで原寸表示。
実操作の記録:/goalを渡してから、ゴールに届くまで2026年10月11日、Studio/JのChromeで検証コンソールを操作し、依頼の入力から完了までを連続で撮影しました。Claude Code本体の処理は約26秒です。
実操作の連続画面収録(約4.0fps・実際の取得間隔で再生)。再生ボタンで操作の流れを確認できます。

結果は次のとおりでした。

回primes.pyの中身判定計測時間
変更前1つずつ割り算で調べるOK7.965秒
1回目の変更後エラトステネスの篩OK0.000秒
  • 最初にClaude Codeが「Goal set」と条件を表示しました。Claudeはまず今の時間を測ってから書き換えました。
  • 1回の書き換えで条件を満たし、各回の時間を表にして終わりました。開始から終了まで約26秒です。
  • 終わった後にbench.pyを実行し直しても「判定: OK」「0.000秒」で、bench.py自体は実行前と同じ中身でした。
  • 今回の出力形式では、判定するモデルの「達成」などの結果は表示されませんでした。課題が簡単だったため、「まだ」と判定されて続く場面も起きていません。

Claudeが書き換えた後のprimes.pyは次のとおりです。

def count_primes(n):
    """n 以下の素数の個数を数える(エラトステネスの篩)"""
    if n < 2:
        return 0
    sieve = bytearray([1]) * (n + 1)
    sieve[0] = sieve[1] = 0
    i = 2
    while i * i <= n:
        if sieve[i]:
            sieve[i * i :: i] = bytes(len(range(i * i, n + 1, i)))
        i += 1
    return sum(sieve)

編集部で試した入力と結果

使用環境:Claude Code CLI(claude -p、編集部の検証用コンソールから起動) / 2.1.296 (Claude Code)

Claude Codeを実際に動かした手順(CLI)

  1. 起動した画面:検証コンソールを開き、claude --versionが2.1.296を返すことと、遅いprimes.pyと計測用のbench.pyを確認した
  2. 実際の依頼を入力:/goalの条件として、ゴール・測り方・変えてよい範囲を1文ずつ書いて入力した
  3. 実行中の様子:Claude Code 2.1.296がOpus 5.5で起動し、Goal setを表示。最初にファイルを確認して計測を実行した
  4. 完了後の結果を確認:primes.pyを1回書き換え、bench.pyは判定OK・0.000秒を表示。bench.pyのSHA-256は実行前と同じ

成果物の確認:検証コンソールが完了後にbench.pyを再実行し、判定OK・0.000秒と、bench.pyのSHA-256が実行前と同じことを照合。primes.pyは書き換え後の内容をZIPに保存。

今回、実際に入力した内容
/goal python3 bench.py の出力が「判定: OK」で、計測時間が0.05秒未満になっている。変更してよいのは primes.py だけで、bench.py は変更しない。primes.py を変えるたびに python3 bench.py を実行して出力をそのまま示し、最後に各回の計測時間を表にまとめる。
実際に得られた結果
目標を達成しました。変更したのは `primes.py` だけで、`bench.py` には手を入れていません。素数かどうかを1つずつ割り算で調べる方法をやめ、エラトステネスの篩(`bytearray` のスライス代入で倍数をまとめて消す方式)に書き換えました。変更は1回で済みました。

変更後の `python3 bench.py` の出力(そのまま):

```
答え: 9592
判定: OK
計測時間: 0.000秒
```

計測時間の比較:

| 実行 | primes.py の内容 | 答え | 判定 | 計測時間 |
|---|---|---|---|---|
| 0(変更前) | 1つずつ割り算で調べる方式 | 9592 | OK | 7.965秒 |
| 1 | エラトステネスの篩 | 9592 | OK | 0.000秒 |

「0.000秒」は小数点以下3桁で丸めた表示なので、実際の時間は0.0005秒未満です。0.05秒の上限を大きく下回っています。

教材・書き換え後のコード・実行ログのZIPを保存 ↓登録不要。変更前のprimes.py(事前の状態は本文に掲載)、Claude Codeが書き換えた後のprimes.py、bench.py、Claude Codeの出力(stream-json)が入っています。

自分の仕事で3つを書くコツ

ここからは編集部の提案です。

  1. ゴールは数字か、はい・いいえで答えられる形にする:「速くする」ではなく「0.05秒未満」「テストがすべて通る」のように書きます。判定するモデルが会話から判断できる形にするためです。
  2. 測り方は、Claudeが毎回会話に出せるものにする:計測のコマンドと「出力をそのまま示す」まで書きます。判定するモデルはファイルを読まないので、結果が会話に出ていないと判定できません。
  3. 変えてはいけないものを書く:Claudeが計測用のファイルやほかのテストを書き換えて、見かけだけ条件を満たすのを防ぎます。今回もbench.pyを変えないと書き、実際に変わっていないことを確かめました。
  4. 粘り方は、区切りとセットで書く:Borisさんの例のように長く続けさせたい場合でも、最初は「20ターンで止める」のような区切りを付けて、進み方を見てから延ばすと安心です。
  5. 途中経過の見せ方も頼む:Borisさんのように、進み具合を表やグラフで見せてもらうと、長い作業でも状況がわかります。今回も、最後に各回の時間を表にまとめてもらいました。

注意点

  • 途中で止まる場合:Claudeがツールを使わず、判定に返事をするだけのターンが続くと、Claude Codeは繰り返しを止めます。条件は残ったまま、操作があなたに戻ります。
  • 直さないと進めないエラー:Claude Codeが管理しているログインの認証に失敗した時、クレジットが足りない時、要約しても会話が収まらない時、使えないモデルを指定した時は、条件が消えます。原因を直してから/goalをもう一度設定します。それ以外のエラーでは、条件は残ります。
  • 判定はStopのプロンプトフック:/goalは、Claudeが作業を終えようとする時に動く、Stopのプロンプトフックを使っています。v2.1.294では、「〜なら続けて」のような指示の形で書いたStopのプロンプトフックの判定が改善されましたが、リリースノートは/goalには触れていません。フックの修正はv2.1.294の記事にまとめています。
  • 今回の実験の範囲:1回だけの、簡単な課題での観察です。何週間もかかる大きな作業での動きは試していません。

よくある質問

/goalを使わずに、普通の依頼で3つを書いても効きますか?

Borisさんの投稿は、モデルに3つを渡すことの話で、/goalには触れていません。普通の依頼に書くこともできます。違いは、/goalを使うと、終わったかどうかを別のモデルが毎ターン確かめ、満たすまで次のターンを始める点です。普通の依頼では、Claudeが自分で終わったと判断した時点で止まります。

条件を満たせない課題だと、いつまでも続きますか?

公式資料では、判定するモデルが「無理」と判断すると条件は消えます。進み方が見えないうちは、回数や時間の区切りを条件に入れておくのがおすすめです。

使用量はどれくらい増えますか?

ターンが続くほど使用量は増えます。/goalを引数なしで実行すると、その条件で使ったトークン数を確認できます。今回の簡単な課題は1回の書き換えで終わりました。

まとめ:任せる前に「終わり」と「測り方」を決める

Borisさんの3つは、長い作業をClaudeに任せるときの依頼の型です。Claude Codeでは、この3つを/goalの条件に書くと、Claudeが自分で測りながら終わりまで進めます。まずは今回のような小さな課題で、条件の書き方と止まり方を確かめてから、本番の長い作業に使ってみてください。