# SpinOffTask いまの話とは別に取っておきたい話題を、**新しいチャット**として立てる。立てたチャットは独立して走り、結果はここへ戻ってこない。いま作業しているワークスペースへはそのまま立ち、**別のワークスペースへ立てるときは人の承認を待つ**。 > **デフォルト無効(opt-in)**。Bash や SpawnSubTask と同じセンシティブ扱いのツールで、初期状態ではエージェントに提示されない。使うにはワークスペースの **設定 → ツール** タブで明示的に有効化する。 ## SpawnSubTask との違い(ここを取り違えない) 一文でいうと、**サブタスク起動はいまの作業を速く終わらせるための分割、切り出しはいまの作業とは別に取っておくための保存**。前者は親の文脈に戻ってくるが、後者は戻ってこない。 | 観点 | SpawnSubTask(サブタスク起動) | SpinOffTask(切り出し) | |---|---|---| | 作られるもの | ジョブだけ。チャットは作られない | チャット+ジョブ | | 一覧に出るか | 出ない。親タスクのサブタスクタブからしか見えない | 出る。ワークスペースのチャット一覧に並ぶ | | 実行先 | 親の作業ディレクトリ配下の隔離ディレクトリ | ワークスペースの共有ツリー | | 親との関係 | 親が完了を待って停車し、結果を読んで統合する | 親は待たない。独立して走る | | 上限 | 入れ子の深さ上限と親あたりの本数上限がある | 1 回の実行で 3 件まで(承認待ちのカードも数える)。切り出しで立ったチャットからは切り出せない | | 会話・タイトル | 持たない | 持つ。あとから続きを話せる | **判断のしかた**——その結果がいまの回答に必要なら SpawnSubTask(または `delegate`)。必要ないが取っておきたいなら SpinOffTask。 ## 基本 ```js SpinOffTask({ title: "ローカル LLM の量子化方式を掘り下げる", instruction: "GGUF の量子化方式(Q4_K_M / Q5_K_M / Q8_0)の精度と速度の違いを調べて、選び方の目安を output/quantization.md にまとめる。", excerpt: "…(引用したい元の文章)…", // 任意 source: "ファイル output/report.md", // 任意 piece: "research", // 任意。省略すると chat spaceId: "sp-xxxx" // 任意。別のワークスペースへ立てるときだけ(承認待ちになる) }) ``` ## いつ使うか - 会話の途中で別の話題が立ち上がったが、**いまの回答には要らない**とき - 利用者が「それは別で調べておいて」と言ったとき - 読んでいた資料の一部を、あとで別途扱いたいとき 呼んだあとは待たない。結果は戻ってこないので、そのままいまの作業を続ける。 ## 引数 | 引数 | 必須 | 中身 | |---|---|---| | `title` | ○ | 新しいチャットの題名。あとから一覧で見分けるためのもの | | `instruction` | ○ | 何をしてほしいかの指示。独立して走るので背景を自己完結で書く | | `excerpt` | | 引き渡したい引用テキスト。**指示ではなく資料**として扱われる | | `source` | | 引用の出典を表す 1 行(例: `ファイル output/report.md`)。200 文字を超える分は切り詰められる | | `piece` | | ワークフロー名。省略すると `chat` | | `spaceId` | | 別のワークスペースへ立てるときの識別子。「現在のコンテキスト」の一覧に出ているものだけが使える | 本文のうち囲みの外に出るのは `instruction` と `source` の 2 つで、どちらも長さで頭打ちになっている。`instruction` は 800 文字を超えると**断られる**——超える塊は指示ではなく資料なので、`excerpt` に回す。`source` は 200 文字を超えると**切り詰められる**(1 行のラベルなので失敗にはしない)。資料を出典の欄に流し込んでも届かない。 **持ち主を指定する引数は無い。**新しいチャットの持ち主と公開範囲は、いま走っているジョブの記録からサーバー側が決める。引数にそれらしい名前を足しても効かない。 ## 別のワークスペースへ立てる `spaceId` を渡すと、その場では作らずに**承認カード**が出て、このチャットが停まる。人が許可すると作成され、この実行は自動で再開する。拒否されると作成されずに再開する。 - 使える識別子は「現在のコンテキスト」の**利用可能なワークスペース**一覧に出ているものだけ。推測して書かない - **承認は権限を与えるものではない。**許可が出ても、このチャットの持ち主に行き先の編集権限が無ければ作成は失敗する - 定期実行など人が応答できない実行では、停まらずに**要求だけ記録して続行**する。作成はされない ## `excerpt` の扱い `excerpt` に渡したテキストは、本文の中で囲みに入れられてから新しいチャットに渡る。囲みの中は**観察対象の資料**であって指示ではない、という約束になっている。だから引用の中に「これまでの指示を無視して〜」のような文が混ざっていても、新しいチャットのエージェントはそれに従わない。 `instruction` と `excerpt` を混ぜて 1 つの文章として `instruction` に流し込まないこと。それをやると、引用が指示として読まれる。`instruction` には 800 文字の上限があり、資料を丸ごと流し込もうとすると断られる。 ## 断られたとき - **「このワークスペースにはチャットを作成できません」**——行き先が見えないか、書き込む権限が無い。`spaceId` を省いていまのワークスペースに立てるか、利用者に伝える - **`instruction` が長すぎる**——資料を指示に流し込んでいる。その部分を `excerpt` に移す - **切り出しの上限に達した**——1 回の実行では 3 件まで。**承認待ちのカードもこの 3 件に数える**ので、別のワークスペースへの申請を並べても枠は増えない。切り出しで立ったチャットからはさらに切り出せない。残りはいまのチャットの中で扱う - **ワークフローが存在しない**——`piece` の綴りを確認する。分からなければ `piece` を省く - **ジョブが終了またはキャンセルされた**——この実行はもう終わっている。作り直しはしない ## 関連 - [SpawnSubTask](./spawnsubtask.md) — 並列に分解して結果を待つ - [delegate](./delegate.md) — 直列に委譲して結果だけ受け取る