diff --git a/AGENTS.md b/AGENTS.md index ea0d1b2..da3967b 100644 --- a/AGENTS.md +++ b/AGENTS.md @@ -8,4 +8,4 @@ - フックや設定変更は一時的なCodexホームで検証する。稼働中の利用環境へ自動インストールしない。 - `python -m unittest discover -s tests -v` と `python scripts/check_package.py` を実行する。現在の版で確認済みの範囲と未検証の実行環境を明記する。 - 公開前に個人パス、秘密値、実行ログ、未完成の生成用プレースホルダーが含まれないことを確認する。 -- 親に独立した有用作業がある時だけ、明確な作業を指定model/effortの子へ渡す。通常実装はTerra/xhigh、限定された重要レビューはSol/highを候補にし、同じ子を継続する。 +- 基準運用は親Terra/xhigh、子Luna/max・Sol/high・Astra/high、適合工程は通常Chat 6 Proを優先する。親の実設定は変更せず、Terra子を標準にしない。並列は親の独立作業、直列の専門委譲は具体的追加価値とホストの許可を確認し、上位指示を迂回しない。 diff --git a/README.md b/README.md index 37c00a2..4ddf68c 100644 --- a/README.md +++ b/README.md @@ -4,14 +4,17 @@ Acecoreが日常利用で改善している分担原則を既定値として同梱します。親のモデル・effortを維持し、引継ぎ、同じ担当の継続、重要なレビューまで含めて、品質と総利用負担を考慮します。次回送信のモデル選択を勧める機能はありません。節約率は未実証です。 -| 子の役割 | 下限 | 標準 | 上限 | -| --- | --- | --- | --- | -| Luna | xhigh | max | max | -| Terra | high | xhigh | max | -| Sol | medium | high | xhigh | -| Astra | high | high | max | +0.8.0の基準運用は、**親Terra/xhighで通常作業を完結し、専門工程だけ固定effortの担当へ渡す**方式です。利用者が選んだ親設定は変更しません。 -モデル別の具体的な条件を標準値より優先します。原則として直接の子は1体で、親にも独立して進める有用な仕事がある時だけ委譲します。Astra親が方針・重要レビュー・最終受入を担当します。別のモデルで開始した選択も維持します。 +| 担当 | 固定値 | 役割 | +| --- | --- | --- | +| 親の基準 | Terra/xhigh | 通常の調査・実装・検証・進行 | +| 子 | Luna/max | 明確な定型工程 | +| 子 | Sol/high | 複雑な実装・原因・重要レビュー | +| 子 | Astra/high | 難しい設計・重大な不確実性 | +| 別経路 | 通常Chat 6 Pro | 適合するまとまった工程の主担当候補 | + +Terra子は標準ルートから外します。min/max設定は互換性のため残し、自動選定は有効なdefault_effortに固定します。既存overrideと他モデル親は保持します。並列分担には親の独立作業が必要で、直列の専門委譲は具体的な追加価値とホストの許可を確認した場合だけ使います。 ## 必要な環境 @@ -84,8 +87,9 @@ Windows以外では定期実行の登録に未対応です。Codexが終了し 通常ChatのGPT-6 ProはWork/Codexと別枠ですが、親の準備・操作・検収はCodex側に残ります。6 Proには契約別の上限があり、無制限ではありません。モデルや残量は実際のUIで確認し、第三者ツール固有の料金まで無料と扱いません。[公式の利用枠](https://help.openai.com/en/articles/20001354)、[Work/Codexの共有枠](https://learn.chatgpt.com/docs/pricing)。 -0.6.0では、この経路を有効にしたrootが、まとまった独立工程の担当選定時にまずChatへの適合を検討します。材料と確認済みツールで完結し、準備・待機・検収・手戻りが見合う比較・分析・設計・文案・レビューは6 Proを優先します。開発も証拠取得→Chatで分析→Codexで実装・検証と分けられます。短い仕事や頻繁な現物照会はCodexに残し、親にも独立作業がある条件を維持します。経路自体は既定で無効、子のmodel・effort表は従来どおりです。有効化後は毎回プラグインを指定する必要はありません。 +0.8.0では有効なroot経路において、6 Proを分析・設計・比較・文案・レビューの**最初の主担当候補**にします。実際の接続・書込み権限・検証環境がそろう実装・テスト・PR作成も対象です。短い仕事やCodex側の現物との頻繁な往復は親または専門子に残します。分類だけで外部書込みやマージを承認せず、同じ分析を別のAstraで全面再実行しません。 +Pro $200の週次枠を積極活用する運用ですが、契約価格だけで経路を有効化しません。[最新上限・送受信方法の許可・比較計画](plugins/codex-task-routing/skills/task-routing/references/chat-limits.md)を確認してください。送信直前は`chat_plan.py --live`で新しい観測を照合し、上限・モデル変更・許可不明で停止します。自動抽出に関する例外の許可は本プラグインでは確認していません。 新規依頼には、目的・材料・合格条件に加え、`handoff` で必要情報、出典要件、鮮度、許可ツール、返却形式、停止条件を渡します。MCPはChat側で必要な操作が使えるかを確認し、回答に実取得の出典・版や日時・取得範囲を求めます。設定済み・選択済みだけを取得成功と扱いません。本文だけの仕事はツールなしで完結させ、承認済み範囲の確認を繰り返しません。 `/codex-task-routing/chatgpt.json` に次を保存します。プラグインキャッシュ内には保存しません。 diff --git a/docs/validation.md b/docs/validation.md index 4c68ba6..d1e9c00 100644 --- a/docs/validation.md +++ b/docs/validation.md @@ -1,5 +1,25 @@ # 検証記録 +## 0.8.1: PR #11の追加レビュー + +2026-09-15、固定HEAD `6f57344a35813698b30ae4010cf350a1901dcc0e` と基準版の25ファイル差分、方針・接続判定・引継ぎ互換・テストをレビューしました。 + +- 元の116件のテストスイートは成功(環境依存2件skip)。入力は256KiB以内でも、JSONの再エスケープでprepare出力が約483KBとなり、後続のvalidate/転送で読めなくなるケースを再現しました。CLIの実出力サイズを準備時に検査し、超過時に未使用のbundleを出力しないようにしました。 +- 初回の書込み等について、未実行の`permission_checked`を追加。操作スキーマ・対象権限の根拠と新しいlive確認を要求し、試験書込みや実行済みの誤申告なしで本来の依頼を候補にできます。advertisedの単独利用、別操作/対象への流用、期限切れ、承認不足は引き続き拒否します。 +- 追加8件の回帰テストで、大きいUnicode/引用符、サイズ境界の受渡し、エラー時の出力・入力保護、初回操作の各ゲートを検証します。実行結果と最終3 OS CIはPRレビューに記録します。 +- 実際のCodex導入・子モデル起動・Chat画面・接続先での実操作・利用量は未検証で、利用者がCodex側で後続確認します。通常Chat自動送受信の許可を新たに確認したものでも、経路を有効化したものでもありません。 + +## 0.8.0: Terra親・固定effort・能力に応じたChat優先 + +2026-09-15、Issue #10の方針を実装しました。意味を変えたのは、通常工程を親で完結、Terra子を標準外、自動effortを有効なdefault_effortへ固定、6 Proを適合工程の最初の主担当候補、並列とホスト許可付き直列を区別する点です。Chatで利用できる機能・権限・検証環境がある実装・PR作成も対象にしました。 + +- 既存のmin/maxと部分overrideを保持し、親の保存設定・実行設定・フック信頼・Chat opt-inは変更しません。新しい自動有効化やモデル呼出しはありません。 +- chat_planの旧入力は並列のまま。直列は明示した追加価値とホスト可否を要求します。--liveは直近のsurface/model/上限通知/承認/転送方法の観測を照合しますが、実アカウントや許可の証明ではありません。 +- 旧0.4/0.5/0.6/0.7の準備済みbundleを厳密照合する互換処理を保持します。新規promptは実装・PRの明示範囲、環境と検証結果の返却を要求し、merge/deployの暗黙承認を禁止します。 +- ローカルLinux/Python 3.13.5で116件成功(環境依存2件skip)、package・diff検査成功。新規12件は固定値とoverride、Terra子の標準除外、旧bundle、直列の可否、liveの各ゲート、期限、read/writeとsurfaceの分離、CLIの入力保護を確認しました。 +- UI、6 Proの実利用上限、子の実行モデル、実プラグイン導入、タスク単位の節約効果は未検証です。自動抽出方法の例外許可は未確認のままで、許可のない自動経路を有効化していません。最終3 OS CIはPRの結果を参照してください。 +- [比較計画と利用条件](../plugins/codex-task-routing/skills/task-routing/references/chat-limits.md)に従い、通常作業の測定範囲がそろうまで節約率を主張しません。 + ## 0.7.1: PR #9の境界値レビュー 2026-09-15、PR #9のローカル転送、接続台帳、キャッシュ公開の差分を確認しました。 diff --git a/plugins/codex-task-routing/.codex-plugin/plugin.json b/plugins/codex-task-routing/.codex-plugin/plugin.json index 52ce040..30d7687 100644 --- a/plugins/codex-task-routing/.codex-plugin/plugin.json +++ b/plugins/codex-task-routing/.codex-plugin/plugin.json @@ -1,6 +1,6 @@ { "name": "codex-task-routing", - "version": "0.7.1", + "version": "0.8.1", "description": "Task delegation policies for research, documents, images, operations, and development in Codex.", "author": { "name": "Acecore", diff --git a/plugins/codex-task-routing/defaults/config.json b/plugins/codex-task-routing/defaults/config.json index 2ccc01c..1909b05 100644 --- a/plugins/codex-task-routing/defaults/config.json +++ b/plugins/codex-task-routing/defaults/config.json @@ -1,6 +1,6 @@ { "schema_version": 1, - "policy_revision": "2026-09-14-observation-completion", + "policy_revision": "2026-09-15-terra-chat-fixed", "models": { "luna": { "id": "gpt-5.6-luna", @@ -28,22 +28,22 @@ } }, "principles": { - "summary": "品質を維持し、速度より引継ぎ・親の確認・手戻り込みの総トークンと利用負担を優先する。親のmodel・effort(Ultra含む)は維持し、次の送信のモデル提案はしない。許可済み作業内の子の起動・設定はAIが選び、確認を取り直さない。\n\n- 担当は必要な判断能力から選ぶ。明確な取得・抽出・定型照合・一意の局所修正はLuna、通常の調査・比較・実装・進行はTerra、複雑な矛盾解消・実装・重要レビューはSol、難解な設計・重大判断はAstra。Astra親は方針・重要レビュー・最終受入を担当する。件数、安心感、effortの比率で決めず、具体条件と選定理由を一言残す。\n- Lunaは全条件が固定された検証済み・低影響の機械照合だけ下限、それ以外の担当内作業は標準。画像目視や意味判断を機械照合に含めない。Terraは原因・方針確定の小変更や限定比較だけ下限、通常の調査・実装・原本網羅・日付や欠測解釈は標準、前提確定の多数の組合せは上限。Solは理解力を要する限定調査・レビューだけ下限、複雑な整合・原因・重要レビューは標準、難しい前提・反証・競合条件は上限。Astra子は重要判断で標準、難しい前提はxhigh、最難問は上限。常に実行時の対応範囲を確認する。\n- 直接の子は同時に原則1体。子の仕事は具体的・限定的・独立し、直接の親にも独立した有用作業が必要。親は委譲済みの探索・実装を先回りしない。親の独立作業後は結果待ちに進む。親→Terra→Lunaまでの追加1段は親が工程・権限・返却条件を明示した場合だけ。伝言係、孫の再委譲、待つだけの起動、制約を別タスクやCLIで迂回することは避ける。\n- まとまった工程を、承認済みの取得・処理→依頼された保存→必要な検証→結果報告まで同じ担当へ渡す。短い確認は現在の担当で終え、修正・継続も適合する既存の子へ差分だけ渡す。modelとeffortを明示し、別モデルへ全履歴forkを渡さない。再開時は要求値と観測値を分け、維持を推測しない。\n- 引継ぎは目的・決定・対象・根拠・合格条件・環境・検証・承認・返却条件に絞る。repoは絶対cwd、repo/worktree、branch/HEAD、対象diffを渡し、不一致を探索やresetで補わせない。全ログや秘密値を渡さない。回答だけで済む仕事に保存物を増やさない。\n- 取得先・必須項目・範囲・取得状態を確認し、HTTP成功・null・0件を不存在や完了としない。原本はページ全体・隅まで実見し、必要時拡大する。OCR空欄は記載なしとせず、未確認・判読不能・未発見・確認範囲内で記載なしを分ける。日付の名称・値・位置を保持し、代表確認で全件必須項目を代替しない。\n- 親は受入条件と重要差分・影響・証拠を確認する。同じrevision・diff・環境・方法の有効な検証は再利用し、追加確認は関連変更・失敗・矛盾・証拠不足へ絞る。別Astraに同じ重要判断を重複させない。承認を代替しない。\n- 矛盾・設計変更・影響拡大・検証不能・具体修正後も同じ問題・新情報のない妥当な検証2回は親へ返す契機。無意味な2回試行は不要。Lunaの担当外の原因推定・新規環境構築・復元は着手前に返す。ログイン・権限・接続エラーはモデル変更で解決せず、条件不変の再試行をしない。\n- 観測は方針内容ごとに通常作業3件まで。開始時フックの残枠を確認し、対象作業の開始と最終報告前に観測CLIで記録を更新する。同じ作業の再開は同じtask_idとsampling_keyを使い、子の結果も親の1記録へまとめる。取得不能な使用量は理由付きnullで記録を閉じ、未取得を未記録のまま放置しない。記録完了と実測の充足は区別し、比較基準なしの節約率は不明。手順は詳細の「利用負担の観測」。常時計測・全会話探索・計測だけの追加実行はしない。\n\n詳細正本は同じディレクトリのmodel-routing-policy.md、分類表はmodel-routing-catalog.md、引継ぎ例はmodel-routing-handoff.md。見出し検索後、必要な節だけ読む。有効な既読条件を再利用する。標準サブエージェントを使い、上位指示・利用可能機能・ユーザーの承認を優先する。自動選定は許容範囲内で、low・none・minimal・Ultraを選ばない。料金や節約の実績を保証しない。\n", - "policy_intro": "# モデル選定・作業内の委譲(2026-09-14更新)\n\n作者の既定方針:Astraを親に残して方針・設計・重要レビュー・最終判断を確認し、実作業は必要な品質を満たす軽い子へ渡す。ユーザー向けのモデル・effort・Ultraの切替提案機能は廃止する。ユーザーがLuna/Terra等から始める選択も尊重し、その親から適切な子へ委譲する。この版の方針は、品質を保ちながら速度より総トークンと利用負担を優先すること。並列化・階層化・effortの分散自体を目標にしない。以下は作業内の運用基準であり、モデルの性能保証ではない。\n\n親会話のモデル・effort(Ultra含む)はユーザーが選んだ設定を維持する。回答末尾の「次の送信:モデル/effort」、昇格・降格の勧め、切替を促す定型案内やその例外条件は設けない。許可済み作業内のサブエージェントの起動とモデル・effort選択は、後述の条件でAIが行う。通常作業や可逆的な実装判断すべてをユーザーに戻すルールではない。\n", - "policy_effort": "### 子のeffortの既定値(2026-09-14対応表反映)\n\n下表を新規割当て・再配分時の基準とし、ユーザーが選んだ親の設定は維持する。表示名は最高=`max`、極高=`xhigh`、高=`high`、中程度=`medium`(`middle`という設定値は使わない)。\n\n| 子モデル | 下限 | 標準 | 上限 |\n| --- | --- | --- | --- |\n| Luna | {{models.luna.min_effort}} | {{models.luna.default_effort}} | {{models.luna.max_effort}} |\n| Terra | {{models.terra.min_effort}} | {{models.terra.default_effort}} | {{models.terra.max_effort}} |\n| Sol | {{models.sol.min_effort}} | {{models.sol.default_effort}} | {{models.sol.max_effort}} |\n\n- モデルを担当能力で選んでから、下記「作業内で使う推論強度と実行条件」の具体的な条件を当てる。Lunaの機械照合は{{models.luna.min_effort}}、通常取得・一意の局所修正は{{models.luna.default_effort}}。Terraは原因と方針が確定した小変更・限定比較だけ{{models.terra.min_effort}}、通常の調査・実装・原本網羅確認は{{models.terra.default_effort}}、前提確定の多数の境界条件を深く詰める仕事は{{models.terra.max_effort}}。Solは広い探索を要しない限定調査・レビューだけ{{models.sol.min_effort}}、複雑な整合・原因・互換性・重要レビューは{{models.sol.default_effort}}、難しい前提再検討・反証・競合条件は{{models.sol.max_effort}}。\n- 具体的な作業条件を標準値より優先し、引継ぎに理由を一言残す。件数・名称・安心感だけで上げ下げせず、effortの比率を目標にしない。適合する既存担当の短い残作業は、そのためだけに再配分しない。画像の目視評価・意味解釈をLunaの機械照合へ含めない。\n- 下限未満・上限超のeffortは自動選定しない。low・none・minimal・Ultraも自動選定しない。上限でも担当能力が足りなければ親へ戻し、未完了部分のモデルを見直す。Luna/{{models.luna.default_effort}}、Terra/{{models.terra.default_effort}}、Sol/{{models.sol.default_effort}}が同等の能力や料金になるという換算ではない。Astraの子が必要な場合は既存の担当・委譲条件に従い、親の選択を変更しない。\n- この表は手戻りを含む総負担を減らすためのユーザーの運用基準であり、性能・節約の実測結果ではない。effortを上げても担当範囲・承認・検証条件は広げず、簡単な仕事に不要な説明やテストを足さない。完了済みの仕事を新設定でやり直さない。\n- 新規起動・再配分時はmodelとeffortを明示する。再開時も初回設定が保たれると仮定せず、要求値と取得できた実行値を分ける。必要な設定を使えない場合は下限未満へ黙って落とさず、未着手のまとまった仕事を適切な子へ渡すか親で進める。実行中の子を設定統一だけのために中断しない。\n- [公式のサブエージェント仕様](https://learn.chatgpt.com/docs/agent-configuration/subagents)と[effortの説明](https://learn.chatgpt.com/docs/models?surface=app)を2026-09-14に確認。強いeffortは時間・トークンを増やし得る。API単価をCodex契約の消費率へ直接換算せず、使えるmodel/effortは実行時の機能で確認する。\n", - "policy_timing": "### 選定のタイミングと基準\n\n- 着手時に担当を選び、計画確定・工程移行時は必要な判断能力や範囲が変わったかだけ確認する。変わらなければ同じ担当を継続し、モデル選定や共通方針の読み直しを繰り返さない。前提・難易度・実際の手戻りが変わった時に再評価する。\n- 「調査/実装」の名前や作業量だけで選ばず、仕様・情報源の明確さ、判断の複雑さ、影響範囲、誤りを検証できるかで選ぶ。工程の見積もりと同様に、方針・設計・実行・検証をさらに判断の必要量で分け、必要な品質を満たす軽い担当へ割り当てる。人の作業単価をそのままモデルへ対応させず、引継ぎ・親の確認・手戻りを含めた総負担を小さくする。\n- 親がAstraなら方針・重要レビュー・最終判断を親に残し、軽い工程は適切な子へ任せる。親のモデルやeffortを維持することと、親が全実作業を行うことは分ける。\n- 再評価条件はAIの内部の選定基準として使い、毎回の回答へチェックリストとして出さない。モデルの割当ては必要な進捗・結果報告やユーザーからの質問への回答で説明する。\n- 一往復で終わる軽微な依頼では選定説明や委譲の負担を増やさず、その場で完了する。\n- ユーザーのモデル指定と委譲範囲を尊重する。必要な確認を実施できない場合は不足する根拠や機能上の制約を報告し、確認済みと扱わない。\n", + "summary": "品質を保ち、子の推論を削るより、引継ぎ・親の再処理・手戻り込みの総利用負担を減らす。作者の基準運用は親Terra/xhighだが、利用者が選んだ親のmodel・effort(Ultra含む)を変更しない。次の送信のモデル提案もしない。\n\n- 通常の調査・実装・検証と進行は親が完結する。Terra子は標準ルートから外し、同モデルへの受渡しのためだけに子を作らない。他モデル親・既存overrideを壊さず、適合する既存担当は継続する。\n- 自動選定のeffortは有効なdefault_effortに固定する。既定はLuna/max、Sol/high、Astra/high、Terra/xhighは親の基準と互換定義。下限・上限はoverride検証用に保持し、毎回のeffort選びに使わない。能力不足は担当を見直し、順番に下位から試す義務はない。\n- 有効な通常Chat経路では、材料・実際のツール・承認・検証環境で完結するまとまった工程は6 Proを最初の主担当候補にする。分析・比較・設計・文案・レビューに加え、条件がそろう実装・テスト・PR作成も含む。難しさだけでCodexのSol/Astraへ固定しない。短い仕事やCodex側の現物を頻繁に照会する仕事は残す。分類と実行許可は別で、契約だけで経路を有効化しない。\n- 委譲は具体的・限定的な完了単位とし、原則同時1件。並列では親にも有用な独立作業が必要。直列の専門委譲は追加価値とホストの許可を確認した時だけ。禁止する上位指示を別CLI・別タスクで迂回せず、条件のためだけに親の仕事を作らない。Chatはrootのみ、子の再委譲は標準にしない。\n- 分類前に難問を解き切らない。問題分割や受入基準の設計も難しければ専門担当へ渡す。元の依頼・重要制約・必要な原資料を保持し、親の誤解を子が訂正できるようにする。子は承認済みの取得・実装・修正・検証・証拠整理まで同じ担当で完結する。\n- model・effortを明示し、要求値と観測値を分ける。全履歴fork・全ログ転送を避け、目的・対象・根拠・合格条件・承認・返却条件を短く渡す。repoでは絶対cwd・worktree・branch/HEAD・対象diffを特定し、不一致を探索やresetで補わせない。\n- 親は重要差分・証拠・受入条件を確認し、有効な検証を再利用する。専門判断の根拠・前提・反例・未解決点を回収し、同じ問題の全面的な解き直しや不要なAstra二重レビューをしない。書込み・マージ・本番反映の承認は別々に守る。\n- 原本全体・必須項目・日付の意味・取得範囲を確認する。HTTP成功・null・0件・OCR空欄を不存在や完了と扱わず、未取得・未確認・判読不能・確認範囲内の記載なしを区別する。画像は実見し、数値測定が必要なら測定する。\n- 矛盾・範囲拡大・設計変更・検証不能・同じ失敗は親へ戻す。不要な差し戻しを減らしても重大な返却は抑えない。権限・接続・材料不足をeffortやモデル変更だけで解決したと扱わない。\n- 観測は方針内容ごとに通常作業3件まで。開始フックの残枠に従い、開始時と最終報告前に同じtask_id・sampling_keyを更新する。子も親の1記録にまとめ、欠測は理由付きnullで閉じる。合計のCodex使用量・Chatのメッセージ・品質・手戻りを分け、割合だけで節約を主張しない。常時計測・全会話探索・測定だけの追加実行はしない。\n\n詳細はmodel-routing-policy.md、分類はmodel-routing-catalog.md、引継ぎはmodel-routing-handoff.mdの必要節だけ読む。通常Chatの利用枠・実行条件はChat経路のreferenceを確認する。上位指示・利用可能機能・承認を優先し、節約や性能の同等性を保証しない。\n", + "policy_intro": "# モデル選定・作業内の委譲(2026-09-15更新)\n\n作者の基準運用は親Terra/xhigh、子Luna/max・Sol/high・Astra/high、適合工程は通常Chatの6 Proを積極的な主担当とする。通常作業と進行を親で完結し、専門工程だけ渡す。Terra子は標準ルートから外す。これは性能・節約の実証ではなく比較する運用方針である。\n\n親モデルを自動変更する機能ではない。利用者の親のmodel・effort(Ultra含む)と既存overrideを保持し、次回送信の切替提案はしない。別モデル親でも、能力に合う作業は親・適合する既存担当で進め、専門判断を必要な担当へ渡す。通常の可逆的な作業は承認内で進め、毎回の続行確認を増やさない。\n", + "policy_effort": "### 子のeffortの固定値と互換性\n\n| 担当 | 自動選定に使う有効な固定値 | 役割 |\n| --- | --- | --- |\n| Luna子 | {{models.luna.default_effort}} | 明確な定型工程 |\n| Sol子 | {{models.sol.default_effort}} | 複雑な実装・原因・重要レビュー |\n| Astra子 | {{models.astra.default_effort}} | 難しい設計・重大な不確実性 |\n| Terra | {{models.terra.default_effort}} | 親の基準。子は標準ルート外 |\n| 通常Chat 6 Pro | UIの6 Pro | 別経路。Codex effortと換算しない |\n\n固定するのは自動選定の基準であり、合格条件ではない。子の推論を十分使い、親の再指示・再調査を減らす。担当外なら固定値で押し切らず、未解決工程を適任へ直接渡す。Astraでも不十分なら根拠と制約を返し、無意味な再試行や合格基準の引下げはしない。\n\n`min_effort`・`max_effort`は既存設定と部分overrideの範囲検証用として保持し、毎回の自動選定の候補にしない。利用者が明示した有効なoverrideを優先する。親の実設定はこの表で上書きしない。子の再開時も設定維持を推測せず、要求値と取得できた観測値を区別する。利用不能な値に黙って置換しない。low・none・minimal・Ultraは自動選定しない。\n\n[公式サブエージェント仕様](https://learn.chatgpt.com/docs/agent-configuration/subagents)を実行時にも確認する。設定値は実行モデルの証明ではない。\n", + "policy_timing": "### 選定のタイミングと基準\n\n短い仕事は現在の適任者で終える。まとまった工程の開始時に、目的・未確定な判断・必要情報・ツール・合格条件・承認範囲を確認する。分類専用のモデルを起動しない。有効なChat経路ならまず適合を検討し、Codex側で同じ分析を先に済ませない。必要な判断能力と現物へのアクセスから担当を直接選ぶ。\n\n新しい矛盾・範囲変更・必要機能の欠如が分かった時だけ再分類する。自信の自己申告や件数だけで決めない。既存担当への差分指示を優先し、effort選択のために細分化しない。\n", "policy_reading": "### 方針を読む範囲\n\n- 解決済みのeffective.mdの要約を入口にし、詳細が必要なら `rg -n \"^### \"` 等で見出しを検索して該当する1節を読む。分類表も必要な分野だけ取得する。通常は1取得20〜40行を目安に出力上限へ収め、長い節は必要部分へ分ける。全文や先頭100行、離れた多数の節をまとめて出すことを既定手順にしない。行数は打切り条件ではなく、必要な条件は不足部分を補って最後まで確認する。\n- 一度確認した有効な条件は同じ作業内で再利用する。担当範囲・前提・方針の変更が分かった時だけ関係する部分を確認し直す。出力が途中で切れた場合は、不足する行範囲だけ補う。ユーザーが文書全体のレビューや編集を依頼した場合は、その範囲を読む。\n- 子には適用する条件を短く渡し、必要なら文書名と該当見出しを添える。既知の条件のために子にも全文を再読させず、適用されるrepo-local guidanceや必須スキルの確認は省略しない。\n", - "policy_classification": "### 作業分類と第一候補\n\n以下は仕事を担当するモデルの候補であり、親モデルの切替表ではない。Astraが親なら、下位モデルに割り当てられる仕事は子へ切り出し、重要な確認と統合はAstraに残す。具体的な仕事の分類は同じディレクトリの `model-routing-catalog.md` にまとめる。該当分野だけ参照し、この文書の委譲条件・担当を見直す境界を適用する。\n\n事前分類は、繰り返す担当選びの判断を減らし、下位へ任せられる部分と上位が確認すべき部分をそろえるための既定値。該当する具体的な条件とeffortを先に選び、未掲載の仕事だけ下表の近い条件を使う。名称だけで一律に割り当てない。複数条件が混在し分離できない場合は、正しい完了に必要な判断へ合わせる。独立したまとまった定型工程を切り出せる時だけ別の軽い担当を検討し、effortのためだけに細分化しない。情報源や合格条件が曖昧なら、Lunaでの試行を必須にせず必要な判断能力から選ぶ。モデル選定は実際の利用可否・ツール要件・既存の承認範囲に従う。\n\n| 作業 | 条件・例 | 第一候補/推論強度 |\n| --- | --- | --- |\n| 単純な事実調査 | 指定ページ・公式資料の特定項目、現行バージョン、設定値、PR状態を出典付きで確認 | Luna/{{models.luna.default_effort}} |\n| 一覧化・抽出・照合 | 固定入力・列・件数・hash等を検証済み手順で機械照合し、解釈を要しない低影響の仕事 | Luna/{{models.luna.min_effort}}。条件を外れれば原則{{models.luna.default_effort}}または担当を再評価 |\n| 要約・整形・定型作成 | 与えられた内容の要約、通常の翻訳、文言修正、既定書式への変換 | Luna/{{models.luna.default_effort}} |\n| 定型操作・検証実行 | 固定環境・既存コマンド・固定の合否判定による低影響の操作やテスト実行 | Luna/{{models.luna.min_effort}}。未知の分岐や解釈を含めない |\n| 画像の定型確認 | 実画像を見て、指定した文字・要素の有無、見切れ、基準画像との差異を既定項目に沿って確認 | Luna/{{models.luna.default_effort}}。画像を確認できる実行環境が前提 |\n| 通常のテスト設計・画像分析 | 仕様から確認観点や境界値を選ぶ、画面の問題を整理し原因・改善案を検討 | Terra/{{models.terra.default_effort}}。前提確定の多数の境界条件はTerra/{{models.terra.max_effort}}、前提や原因自体の判断はSol/{{models.sol.default_effort}} |\n| 局所的な小変更 | 修正内容が一意、依存が少ない、差分と結果を直接検証できる | Luna/{{models.luna.default_effort}} |\n| 限定比較 | 項目の意味・比較範囲・判定条件が明確で未知の例外が少ない少数資料の比較 | Terra/{{models.terra.min_effort}} |\n| 原本の網羅確認・日付や欠測の解釈 | 異なる帳票レイアウト、必須項目の見落とし確認、発行日・利用期間・決済日の区別、記載なしの判断 | Terra/{{models.terra.default_effort}}。下記の原本確認条件を適用 |\n| 曖昧な文書・メールの分類 | 複数の意味候補、例外、欠測や矛盾を根拠付きで判定 | Terra/{{models.terra.default_effort}}。検証済み規則の機械適用とは分ける |\n| 範囲を絞れる不具合調査 | 再現可能で、ひとつの機能・サービス内のコードとログから原因候補を検証する | Terra/{{models.terra.default_effort}} |\n| 原因・方針確定の小修正 | 原因と修正方法が既知で、未知の依存や例外が少ない限定変更 | Terra/{{models.terra.min_effort}} |\n| 方針が確定した通常実装 | 受入条件が明確な機能追加、UI変更、限定的なリファクタリングと適切な検証 | Terra/{{models.terra.default_effort}} |\n| 通常の成果物レビュー | 明確な仕様・範囲・期待値との整合、回帰、読みやすさを検証。原本の網羅確認や高影響の判断を含まない | Terra/{{models.terra.default_effort}} |\n| 複雑な調査・比較 | 資料の矛盾や例外を解消、複数サービスの因果関係、詳細な費用・運用条件の分析 | Sol/{{models.sol.default_effort}} |\n| 判断を伴う複雑な実装 | 既存設計内で複数モジュールを調整、互換性維持、難しいテスト設計・原因修正 | Sol/{{models.sol.default_effort}} |\n| 重要なレビュー | 認証・課金・個人情報・DB移行・本番運用に影響する変更の妥当性判断 | Sol/{{models.sol.default_effort}}。設計横断・不可逆性・重大な不確実性があればAstra/{{models.astra.default_effort}} |\n| 方針・設計・意思決定 | 要件整理、構成・移行戦略、運用ルール、事業上の重要な比較、品質・費用・安全性のトレードオフ | Astra/{{models.astra.default_effort}} |\n| 難解な問題・重大判断 | 複数システムにまたがる原因不明障害、設計前提の崩壊、重大で取り消しにくい判断 | Astra/{{models.astra.default_effort}}。必要な場合のみxhigh |\n\n- 単純調査のLuna条件は「何を、どこで確認し、何をもって回答できるか」が明確なこと。最新情報でも取得・照合だけならLunaでよい。情報の矛盾、原因推定、重大な判断が加わった段階で分類し直す。\n- 認証・課金・税務等の話題でも、事実の収集と意思決定を分ける。Lunaが公式情報を集めることは可能だが、重大な解釈・変更判断を単純作業に分類しない。上位モデルでも公式根拠や必要な専門確認は省略しない。\n- 本番操作は短い手順でも影響と検証可能性を考慮する。高影響の操作はSol以上を候補にする。モデルの選定は既存の承認条件を変えない。\n- PRレビューやマージ可否は、手順が明確でも差分の妥当性・回帰・影響を判断する必要がある。配信確認でも、状態の取得と期待した内容が配信されたかの評価を分ける。親がAstraなら重要な差分・根拠・受入条件を親が確認し、CI結果・配信状態・既定項目の取得や照合等は適切な子へ任せる。軽微な変更まで別のAstraを追加して全件再レビューする運用にはしない。\n- 高影響な要約・翻訳、未知の画面で分岐判断が多い操作、複雑な表計算・資料作成等は、上表の判断量に合わせて上げる。生成画像等は適した専用ツール・スキルも使う。\n", - "policy_test_image": "### テスト・画像確認を切り分ける基準\n\n- **実行・照合:** 対象環境・既存コマンド・期待する機械的な合否判定が固定された低影響の検証は、例外条件を満たせばLuna/{{models.luna.min_effort}}を第一候補とする。失敗原因の調査や環境構築へは広げない。実画像の指定ラベル・見切れ・基準画像との差の確認はLuna/{{models.luna.default_effort}}を原則とする。画像を見て判断することと、検証済みツールの固定数値を機械照合することを混同しない。\n- **作成・分析:** 入力と期待結果が一意で、既存パターンに沿った局所的なテスト追加はLuna/{{models.luna.default_effort}}の候補。何を検証すべきか、期待結果が正しいか、失敗原因やUIの改善策を考える必要があればTerra以上へ見直す。設計と範囲が確定した多数の境界条件の検討はTerra/{{models.terra.max_effort}}、非決定的な失敗や複数機能の相互作用から原因自体を判断する場合はSol/{{models.sol.default_effort}}を使う。要件と重要な受入判断はAstraが親なら親に残す。\n- **証拠と限界:** テストは対象revision・差分・環境に加え、成功/失敗/skip/未実行を区別する。画像は子がアクセスして実際に閲覧できる画像パスや対応ツール、確認範囲・基準画像・比較に必要な画面条件を渡す。親の文章やDOMだけから画像を見たと扱わず、不鮮明・未取得は不明とする。正確な寸法・色値・画素差が必要なら測定ツールで確認する。\n- 合格した項目の範囲を明示し、テストの成功や画像の一部確認から全体の品質を断定しない。親は重要な証拠・差分と受入条件を確認し、対象・条件が同じ既存結果を再利用する。短い検証だけを細分化して子を増やさず、既存の委譲条件に従う。\n", - "policy_originals": "### 原本・必須項目・記載なしを確認する条件\n\n- 既知の場所にある指定ラベルを照合する仕事と、どこに何が記載されているかを網羅的に探す仕事を分ける。後者や日付の意味・例外を判断する工程はTerra/{{models.terra.default_effort}}から始める。実際の見落としや手戻りが判明した条件は、モデル・effort・確認手順の組合せを見直してから同種の未着手作業へ適用する。effort変更の効果を確かめるだけの再実行はしない。\n- 原本の必須項目を確認する時は対象ページ全体を実見し、ヘッダ・フッタ・四隅も確認する。小さい文字や判読しにくい箇所は必要時に拡大する。OCR・抽出テキストだけの空欄を記載なしと扱わない。形式ごとの代表1件で抽出方法を照合してから展開するが、残りの各対象の必須項目確認を省略する根拠にはしない。\n- 値と取得状態を分け、未確認/判読不能/探索したが見つからない/指定範囲を全て確認したうえで記載なしを区別する。確認済みとする範囲と根拠のページ・位置を残し、全件nullや予想外の欠測は取得方法と範囲を再確認する。範囲外の不存在へ一般化しない。\n- 日付は原本上の名称・値・位置を保つ。発行日、利用期間、決済日、取引日を混同せず、依頼された列への対応は合意済みの定義に従う。未定義なら元の値を保存して対応判断を親へ返し、発行日を勝手に取引日へ変換しない。通常の資料整理から税務等の重大判断へ広げない。\n", - "policy_luna_timing": "### Lunaを検討するタイミング\n\n- **着手時:** 親が対象・出典または操作・合格条件を把握したら、まとまった定型作業をLunaへ渡せるか先に判断する。指定資料の項目収集、複数ログから決まった値の抽出、複数PRのCI状態一覧等。Lunaを候補とし、固定手順・固定期待値の低影響な機械照合なら{{models.luna.min_effort}}を選ぶ。それ以外の担当範囲内の取得・照合は原則{{models.luna.default_effort}}とする。調査という名前だけでTerraへ固定しない。\n- **方針や原因が確定した後:** 残作業を再評価し、修正内容が一意で局所的な変更、既定形式の文書作成、既存テストの実行と合格条件の照合ならLunaを候補にし、前述の機械的な検証条件を満たすものは{{models.luna.min_effort}}とする。仕様確定済みでも通常の機能実装や依存関係の判断を伴う仕事はTerra以上を候補にする。\n- **レビュー・配信確認時:** 既に必要な確認項目が決まっている場合、まとまった事実取得をLunaへ任せ、重要な差分・影響・マージ可否・配信内容の評価は親が行う。Lunaを使うためだけの追加レビューやテスト工程は設けない。\n- いずれも親に独立した有用な仕事があり、子が親の作業を代替できる場合に起動する。1〜2回の確認で終わる仕事は親で完了し、稼働中の子が持つ文脈を捨てて短い残作業だけ別のLunaへ渡さない。Lunaの利用件数を目標にしない。\n- 矛盾、原因推定、仕様選択、影響拡大が判明したら根拠を親へ返して担当を再評価する。親がTerraでも同じLuna基準を使い、親のモデル設定は変えない。\n", - "policy_retrieval": "### 定型取得の合格条件と担当を見直す境界\n\n- 取得を任せる時は対象ID・出典/API endpoint、必要な項目と型、ページング・対象期間、0件と未取得を見分ける条件を必要な範囲で渡す。既に根拠がある対応表を使い、親が全対象を先に取得する必要はない。取得先を探す通常調査と、原本の網羅確認・意味の区別・曖昧な分類・欠測の解釈はTerra/{{models.terra.default_effort}}を標準とする。\n- 同じ方法で複数件を取る場合、子が最初の代表1件で取得先・応答項目・型・対象を確認してから展開する。200応答でも必須項目がなければ、その値は確認できていない。404・403・省略された項目・null・0・空配列を同じ「なし」にまとめず、取得状態と実値を区別する。親の再取得を必須化せず、親は重要判断や矛盾のある部分の根拠を確認する。\n- 全件nullや予想外の0件、資料にある実体が見つからない場合は、参照先・絞込み条件・取得範囲を一度照合する。明白な抽出箇所の訂正で解決できれば担当内で直し、なお不明・矛盾が残るなら取得済み結果と未取得理由を親へ返す。HTTP成功や検索結果なしだけを、対象の不存在・安全性の根拠にしない。\n- Lunaへの取得依頼から、失効した成果物の復元、新規の依存環境構築や未指定の再ビルド、原因推定、複数履歴の統合へ進む必要が出たら、代替作業へ着手する前に親へ戻す。親が必要性を判断し、通常はTerra/{{models.terra.default_effort}}へ再配分し、前提や能力の境界が変われば対応表でモデルを見直す。検証済みの既存コマンドを指定環境で実行する仕事はLunaの候補に残し、effortは前述の固定手順の例外条件で選ぶ。権限・ログインの問題はモデルを変えれば解決すると扱わない。\n- タイムゾーン・再開区間・親子の所属・累積値を扱う集計処理の新規実装や修正は、定型抽出と分けてTerra/{{models.terra.default_effort}}を標準とし、前提確定の多数の組合せ検証は{{models.terra.max_effort}}、集計定義の矛盾や前提自体を判断する場合はSol/{{models.sol.default_effort}}を候補にする。Lunaは検証済み処理を指定対象に実行し、決まった項目を返す範囲に使える。期間の集計では日時型、明示したID、開始前からの継続と新規開始、進行中と完了、欠測・resetを分ける。件数やモデル比率は元の各行と親子関係へ戻して確認し、自己申告の合計だけを採用しない。\n", - "policy_escalation": "### 親への返却と上位の子への再配分\n\n子は以下を検出したら根拠と未解決点を親へ返す。親は必要な判断を引き取るか子を再配分する。親が下位モデルでAstraの確認が必要な場合は、独立した有用なレビューとして委譲条件を満たす範囲をAstraの子へ任せる。実行していないAstraの確認を完了済みと扱わず、ユーザーのモデル指定と本番操作等の承認範囲を守る。必要な委譲ができない場合は、実施可能な作業を進めたうえで未解決点と制約を報告する。\n\n- 開始前に上位の分類に該当すると分かった時点で担当を見直す。失敗するまで待たず、親はLunaの担当範囲をSol/Astra等の子へ直接再配分してよい。再配分は既定で親が行う。後述のTerraへの進行委譲を明示した場合だけ、その範囲内のLuna起動を認める。\n- 公式情報・実測・コードが矛盾し、通常の照合で解消しない。原因の説明に未検証の推測が必要になる。\n- 当初の範囲を越える依存、設計変更、仕様の選択、セキュリティ境界、高影響のデータ操作が判明した。\n- 異なる妥当な仮説を2つ検証しても証拠が増えない、または修正と検証を2回行って同じ問題が残る。回数は再評価の目安であり、無意味な試行や2回待つことを要求しない。\n- 受入条件を満たした根拠を示せない、反証を解消できない、必要な文脈を保持できない。自己申告の自信だけで継続を決めない。\n- 昇格先は未解決部分に必要な最小のモデルを選ぶ。単なるツール障害、権限不足、ログイン待ち、情報源の欠落は上位モデルだけで解決しないので、必要な環境対応・情報確認として扱う。\n", - "policy_handoff": "### 軽い子への委譲と引継ぎ\n\n- 上位モデルで方針・原因・対象範囲・受入条件が確定し、残りが定型調査や実装になったら、委譲条件を満たす範囲をLuna/Terra等の子へ任せる。Astraが親ならその親を維持し、方針の整合・重要レビュー・最終判断を担当する。\n- 再読込み・説明・レビューの負担が節約を上回る短い残作業は現在のモデルで完了してよい。新しい根拠なしにモデルを往復させない。\n- 別コンテキストへ実際に委譲する時、目的、決定事項と理由、対象ファイル/URL/branch・worktree、確認済み根拠と未解決点、受入条件・検証方法、既存の承認範囲、親へ戻す条件を必要十分に渡す。既知のOS・権限・sandbox等の制約と、利用可能な検証環境も短く添える。秘密値は含めない。\n- repo作業の引継ぎには絶対cwd、期待するrepo/worktree・branch・HEAD、対象ファイルの未commit差分の有無と識別を既知の範囲で添える。子は最初から指定cwdを明示して、対象repoの場所・branch/HEAD・statusを確認し、既知の差分と照合してから探索・検証・編集する。detached HEADは期待値と一致すれば問題ない。指定先が存在しない、または予期しない不一致が残る場合は根拠を親へ返し、別worktreeを探し回る、reflogから復元する、checkout/resetで合わせる等へ勝手に広げない。Git外の仕事にGit確認を追加する必要はない。\n- 検証結果はコマンドまたは確認方法、cwd・関係する環境、終了コードと結果、実行時刻、検証したrevisionと未commitの対象差分の識別、証拠の場所を必要な範囲で渡す。HEADだけで未commit変更を検証済みと扱わない。対象ファイルのhashまたは秘密を含まない保存diffで同一性を示せばよく、無関係なファイルを集めない。読み取り調査なら出典・取得時刻・必要な結果への参照でよい。\n- 証拠は作業先の既存artifact領域に、秘匿値を除いた要約・必要なログ、または再参照できる既存ツール結果の場所として残す。保存漏れだけを理由に完了したテストを再実行せず、利用できる実行結果を保存・参照する。秘密情報を避けて必要な証拠を残せなければ、欠測と制約を報告する。\n- 親は重要な根拠と差分、検証対象・実行条件・受入条件の一致を確認して結果を再利用する。関連ファイルや条件の変更、結果の失敗・不十分さ、必須チェックの未実施があれば必要な範囲を追加検証する。必須チェックや重要レビューを省略せず、理由なく全件を再実施しない。検証完了後の不要な手直しで再検証を増やさない。\n- 共通の短い記入例は同じ有効方針ディレクトリの `model-routing-handoff.md`。必要な項目だけ使い、ユーザーへの回答に毎回フォームを出さない。\n", - "policy_reasoning": "### 作業内で使う推論強度と実行条件\n\n担当モデルが決まった後、次の8通りで選ぶ。単なる難易度の印象ではなく、前提の確定度・必要な判断・検証範囲で区別する。具体的な業務は `model-routing-catalog.md` の対応行へ当てる。\n\n| モデル | effort | 選ぶ作業・条件 |\n| --- | --- | --- |\n| Luna | `{{models.luna.min_effort}}` | 検証済みコマンド、件数・hash・CI状態の照合。対象・手順・期待結果が固定、機械照合でき、解釈不要で低影響 |\n| Luna | `{{models.luna.default_effort}}`(標準) | 指定資料抽出、既知パターン探索、一意の局所修正。照合・取り違え防止に注意が必要 |\n| Terra | `{{models.terra.min_effort}}` | 原因と修正方針が確定した小変更、既定条件の限定比較。未知の依存や例外が少ない |\n| Terra | `{{models.terra.default_effort}}`(標準) | 通常の調査・実装・検証工程、原本の網羅確認、日付の意味、曖昧な分類、欠測の解釈 |\n| Terra | `{{models.terra.max_effort}}` | 設計・担当範囲が確定し、多数の境界条件や組合せを深く詰める必要がある |\n| Sol | `{{models.sol.min_effort}}` | Solの理解力を要する限定調査・レビュー。論点・対象・合格条件が明確で、広い探索を伴わない |\n| Sol | `{{models.sol.default_effort}}`(標準) | 複数モジュール整合、難しい不具合、互換性修正、矛盾する証拠の整理、重要レビュー |\n| Sol | `{{models.sol.max_effort}}` | 設計前提の再検討、複雑な因果関係、難しい反証・競合条件を伴う調査 |\n\n- Terra/{{models.terra.max_effort}}は確定した範囲の中を深く詰める仕事、Sol/{{models.sol.default_effort}}は何が問題か・どの前提が正しいか自体を判断する仕事。Sol/{{models.sol.max_effort}}はその判断に難しい反証や設計上の対立がある場合。単なる項目数や作業時間では上げず、重大判断・承認は親へ返す。\n- Luna/{{models.luna.default_effort}}でも担当外の意味・設計判断は行わない。effortを上げてもモデルの能力を同等化できるとはみなさない。難しさの種類が変わったらモデルを先に再評価し、同じ担当の範囲内で必要な深さだけが変われば許容範囲内でeffortを選び直す。安い順・弱い順の試行を義務にしない。\n- highの用途を残すためだけに通常工程を細分化しない。Sol/{{models.sol.min_effort}}もSolの理解力が必要な限定作業の候補であり、Terraや既存担当で終わる短い仕事を新しいSolへ渡す理由にしない。\n- Astraの子は既存の重要判断・独立レビューの条件に限り、{{models.astra.default_effort}}を基点に難しい前提・反証ならxhigh、分割しにくい最難問なら{{models.astra.max_effort}}を選ぶ。親Astraの設定はこの選定表の対象外。別Astraに同じ判断を重複させない。\n- モデル名・対応effortは実行時の機能で確認する。Astra = {{models.astra.id}}、Sol = {{models.sol.id}}、Terra = {{models.terra.id}}、Luna = {{models.luna.id}}。利用不可なら承認内の適切な担当か親で進め、必要な能力・確認を満たせなければ未解決点を報告する。\n- low・none・minimal・Ultraは自動選定しない。親が選択したUltra等は維持する。指定できないeffortを使用済みとせず、子の再開でも要求値と観測値を分ける。料金・速度・利用枠の削減は未測定で、API単価をCodex契約の消費率として扱わない。\n- この表は許可済み作業内のサブエージェント選定に適用する。親設定・別タスク・プラグイン・追加購入・本番操作等の承認範囲を広げず、上位指示・利用可能機能を優先する。\n", - "policy_parent": "### 親会話の選択と作業内の委譲\n\n- 親の選択はユーザー、許可済み作業内の子の選択はAIが担当する。品質を維持しつつ利用負担を下げる見込みがある範囲を、適切なモデル・effortの子へ積極的に任せる。毎回の起動・再配分の確認は取り直さない。ユーザーが子も含めてモデルや委譲の範囲を明示した場合はそれを守る。\n- 子は親が行うはずだった作業を代替する。親は必要な判断・未解決点・結果の確認と統合を担う。親が既に持つ方針判断を既定で別のAstraへ重複委譲しない。Sol/Astraの子は、独立した重要レビュー等で追加価値がある場合に限る。\n- 標準のサブエージェント機能でモデル/effortを明示する。親の保存設定・実行時のユーザー選択・service_tierは変更しない。過去の導入時の設定を現在値とみなさない。この分担設定の適用を理由に、追加プラグイン、専用エージェント定義、一律Lunaのグローバル既定値、外部有料サービスを導入しない。\n- サブエージェントはUltra専用ではない。通常のeffortでも適用される指示・対応機能に従って利用する。Ultraを節約の前提条件にせず、選んだだけで子が軽いモデルになるとは仮定しない。利用できなければ親で可能な作業を続け、別モデルで実行できたと主張しない。\n", - "policy_hierarchy": "### 時間より利用負担を優先する進行・階層委譲\n\n- 既定は親から担当へ1段で、まとまった工程を同じ担当が進める。細かな確認ごとにAstraへ戻す、親子が同じ資料を再読する、作業ごとに新しい子を起動する負担を避ける。既に文脈を持つ担当で終えられる短い残作業はその担当に残す。\n- Astraが親なら、最初に目的・設計・許容範囲・受入条件・戻す条件を決める。方針が固まった複数手順の通常工程はTerra/{{models.terra.default_effort}}へ実装と進行をまとめて任せてよい。原本の網羅確認や例外の解釈も{{models.terra.default_effort}}を標準とし、{{models.terra.min_effort}}/{{models.terra.max_effort}}は対応表の具体的な条件に合う場合だけ選ぶ。Terraは範囲内の手順選択、修正、検証、証拠整理まで行い、親は独立した重要な前提・影響の確認と、最後の重要根拠・差分・受入判断に集中する。設計変更・承認境界・重大な問題が出た時は途中でも親へ戻す。「最初と最後だけ」を安全性や受入確認の省略条件にしない。\n- 引継ぎでは既存の承認範囲内の「取得・処理→依頼された成果物の保存→必要な検証→結果報告」を完了単位として示す。中間成果や件数の節目だけで止めず、子は許可済みの後続処理を同じ担当で続ける。途中経過を完了扱いにせず、真の制約・承認境界・親へ戻す条件がある時は完了分と残り・阻害理由を返す。新しい承認を必要としない続行確認を繰り返さない。\n- 必要なブラウザ・ファイル・ツールをその子が使えるか着手時に最小限確認する。利用不能なら既存の許可と利用可能な範囲で代替し、解消できなければ制約を親へ返す。未依頼の既存ブラウザプロファイル操作へ広げない。複数行や複雑な引用を扱う処理は作業領域のスクリプトに保存して実行し、シェル間の文字展開を重ねない。保存・検証済みの中間成果を再利用し、引用エラーだけで原本取得からやり直さない。\n- 単一のLuna仕事だけなら親からLunaへ直接渡す。Terraが通常実装や統合も担い、さらに分離できるまとまった機械的取得・検証がある時だけ、親はTerraにLunaへの再委譲を明示できる。目的、許可する工程、model/effort条件、書込み対象、終了・返却条件を渡す。単なる伝言係や節約の実証だけの階層は作らない。\n- 階層の上限は親→Terra→Lunaの2段(親を含む3層)。これは運用上の上限であり、機能が保証する上限ではない。孫Lunaは再委譲しない。TerraがSol/Astraによる判断を必要とする時は親へ返し、ルートAstraと同じ判断を別のAstraへ重複させない。\n- 直接の子は同時に原則1体。上記の階層ではTerra1体とそのLuna1体までを目安に、各層が別の有用な仕事を担当する。2体以上の兄弟を同時に動かすのは、実際の独立性と全体の重複削減に理由がある場合だけで、時間短縮や空き枠だけを理由にしない。処理順を直列にしただけで総トークンが減るとはみなさない。\n- 起動には、その時の上位指示と機能が優先する。作者の既定運用では、子の仕事が具体的・限定的・独立であり、直接の親にも並行して進められる有用な仕事が必要。この条件はTerraからLunaを起動する時にも適用する。親が待つだけの純粋な直列委譲はこの条件下では起動しない。要件を満たすために不要なレビュー・調査を作らず、親または既存の担当で完了する。別タスク、CLI多重起動、プラグイン等で制約を迂回しない。\n- 待機が可能な段階では結果待ちを使い、頻繁な状態取得・同じ進捗の再報告・先回りした再実装を避ける。ユーザーへの必要な進捗連絡と追加指示への対応は維持する。\n- 公式資料でも、子には独自のモデル・ツール処理と追加トークンがある。階層化は常に安くなる仕組みではない。最小限の引継ぎ、同じ担当の継続、既存結果の再利用を先に行い、親の実作業を十分に代替できる場合に使う。[標準サブエージェント](https://learn.chatgpt.com/docs/agent-configuration/subagents)、[effortとUltra](https://learn.chatgpt.com/docs/models?surface=app)(2026-09-14確認)。子による再委譲の可否は実行時のツール仕様・上位指示で確認し、未実行の階層を検証済みと扱わない。\n", - "policy_economy": "### 子への割当てと節約の条件\n\n担当の具体例は `model-routing-catalog.md` を使い、この節では引継ぎと親の作業量を決める。短い確認は現在の担当で終え、起動・階層の条件は前節に従う。\n\n1. **割当てに必要なところまで調べたら渡す。** 目的・対象・制約・成果物・合格条件が示せ、親の独立した有用な仕事もある時点で委譲する。実装箇所や手順を全部特定するまで親が探索しない。計画に必要な情報の選別を伴う調査はTerra以上に任せられるが、曖昧さの解釈や重大な設計判断は親が担う。Lunaへの抽出依頼へ意味の選別を紛れ込ませない。\n2. **子が代替する工程と、親に残す論点を決める。** 起動時に一文ずつ示せばよく、別の計画書は不要。子には承認済みの調査・実装・必要な検証・報告までをまとめる。親は同じファイルの探索・実装を先回りせず、独立した重要な前提を確認する。それが終わったら結果待ちへ進み、待ち時間を埋めるための作業を増やさない。\n3. **説明と手直しを含めて担当を選ぶ。** Lunaに渡すためだけに親が解法をほぼ完成させる必要があるなら、通常の判断を含む工程はTerra、複雑な矛盾・互換性の解消を含む工程はSolを第一候補とする。既知の同種作業で親の細かな指示や修正往復が膨らんだ場合も、未着手分から見直す。全モデルを安い順に試す必要はない。モデル別の下限・標準・上限と、対応表の具体的な条件を守る。\n4. **同じ仕事は同じ担当へ続けて渡す。** 完了後の修正・追加検証も、担当能力・文脈・再開機能が適合する既存の子を優先し、追加指示は変更要求・新しい根拠・合格条件の差分に絞る。設定の要求値と観測値を区別し、再開時のmodel/effortを確認できなければ不明とする。指定や必要な実行条件を満たせない、再開不能、文脈喪失、能力・範囲変更の場合は、未完了分と既存成果だけを引き継ぐ。キャッシュ維持は機能次第で保証しない。キャッシュ目的の定期呼出しや無関係な仕事の詰込みは行わない。\n5. **親の受入を重要差分と不足へ絞る。** 子の結論だけで合格にせず、受入条件と重要差分・影響・検証根拠を照合する。対象revision・未commit差分・環境が合う既存の合格結果は再利用し、追加確認は関連変更・失敗・矛盾・証拠不足・必須チェックの欠落がある部分に限る。軽微な修正依頼は可能な範囲でまとめて同じ担当へ返す。子の適切な実装を親の好みだけで書き換えて再検証を増やさない。本番・マージの承認と重要レビューは省略しない。\n6. **報告と回復を短くする。** 結論、変更、検証結果への参照、未解決点を返し、全ログ・全履歴・秘密値を貼り戻さない。具体的修正後も同じ問題が残る、情報が増えない、前提や承認範囲が変わる場合は、既存成果を保って親へ返す。権限・ログイン・ツール障害はモデル変更で解決すると扱わず、条件不変の再試行や委譲連鎖を作らない。\n", + "policy_classification": "### 作業分類と第一候補\n\n入口の選択は能力、利用環境、引継ぎ負担で決める。モデルの上下だけの一本道にしない。通常Chat経路のopt-in・利用条件・実際の機能がそろう場合、まとまった工程は6 Proを第一候補にする。文案だけでなく、承認されたツールと検証環境で完結する実装・PR作成も候補である。\n\n| 条件 | 第一候補 |\n| --- | --- |\n| 短い確認・整形・局所修正、通常の調査・実装・検証 | 親。基準運用はTerra/{{models.terra.default_effort}} |\n| 明確でまとまった取得・抽出・照合・既定手順 | 委譲が見合えばLuna/{{models.luna.default_effort}} |\n| 材料がそろう比較・分析・要件・設計・文案・レビュー | 有効な通常Chat 6 Proを最初の主担当候補 |\n| 接続先の取得・編集・テスト・PRまで対象と承認が明確 | Chat側の実能力で完結すれば6 Pro。名称だけで不可にしない |\n| Codex側のコード・テスト・新規ログ照会を繰り返す複雑な工程 | Sol/{{models.sol.default_effort}} |\n| 難しい設計前提、重大な不確実性、現物と密な往復が必要 | Astra/{{models.astra.default_effort}} |\n| 原本の網羅・日付・欠測・曖昧な分類 | 親Terra、または原本を実見できる6 Pro。Lunaの機械照合にしない |\n| 承認・必須情報・権限が不足 | 不足を報告。モデル変更だけで補完しない |\n\nChat不適合ならCodex側の適任へ渡す。認証・課金・個人情報・DB移行・本番操作等は影響と不可逆性を評価し、専門判断と人の承認を維持する。詳細な分野別条件は分類表の必要節だけ読む。\n", + "policy_test_image": "### テスト・画像確認を切り分ける基準\n\n既存コマンド・固定環境・機械的な合否判定だけの検証はLuna/{{models.luna.default_effort}}の候補。失敗原因の推定や新規環境構築へ勝手に広げない。仕様から観点を選ぶ通常のテスト設計・画像分析は親Terraが行い、複雑な原因や互換性の判断はSol、難しい前提はAstra。必要な素材とツールがそろう工程はChat候補も検討する。\n\n画像の指定ラベル・見切れの照合でも実際に閲覧する。親の説明やDOMだけで実見したと扱わず、不鮮明・未取得は不明とする。寸法・色値・画素差は測定する。テストは対象revision・未commit差分・環境と成功/失敗/skip/未実行を分け、成功した一部から全体の品質を断定しない。\n", + "policy_originals": "### 原本・必須項目・記載なしを確認する条件\n\n- 既知の場所にある指定ラベルを照合する仕事と、どこに何が記載されているかを網羅的に探す仕事を分ける。後者や日付の意味・例外を判断する工程は、原本を実見できる親Terraまたは有効なChat経路の6 Proを候補にする。実際の見落としや手戻りが判明した条件は、モデル・effort・確認手順の組合せを見直してから同種の未着手作業へ適用する。effort変更の効果を確かめるだけの再実行はしない。\n- 原本の必須項目を確認する時は対象ページ全体を実見し、ヘッダ・フッタ・四隅も確認する。小さい文字や判読しにくい箇所は必要時に拡大する。OCR・抽出テキストだけの空欄を記載なしと扱わない。形式ごとの代表1件で抽出方法を照合してから展開するが、残りの各対象の必須項目確認を省略する根拠にはしない。\n- 値と取得状態を分け、未確認/判読不能/探索したが見つからない/指定範囲を全て確認したうえで記載なしを区別する。確認済みとする範囲と根拠のページ・位置を残し、全件nullや予想外の欠測は取得方法と範囲を再確認する。範囲外の不存在へ一般化しない。\n- 日付は原本上の名称・値・位置を保つ。発行日、利用期間、決済日、取引日を混同せず、依頼された列への対応は合意済みの定義に従う。未定義なら元の値を保存して対応判断を親へ返し、発行日を勝手に取引日へ変換しない。通常の資料整理から税務等の重大判断へ広げない。\n", + "policy_luna_timing": "### Lunaを検討するタイミング\n\nLuna/{{models.luna.default_effort}}へ渡すのは、取得元・手順・必要項目・合格条件が明確で、まとまった工程を代替できる時。親の短い確認を移すだけ、全件を親が先に取得してから再取得させるだけの起動はしない。\n\n指定資料の抽出、一意の局所修正、既存テスト実行の候補を使い、原本の欠測解釈・複雑な日付・原因推定・未知の環境構築は親へ返す。件数が多いことだけを上位モデルや細かな分割の理由にしない。\n", + "policy_retrieval": "### 定型取得の合格条件と担当を見直す境界\n\n- 取得を任せる時は対象ID・出典/API endpoint、必要な項目と型、ページング・対象期間、0件と未取得を見分ける条件を必要な範囲で渡す。既に根拠がある対応表を使い、親が全対象を先に取得する必要はない。取得先を探す通常調査と、原本の網羅確認・意味の区別・曖昧な分類・欠測の解釈はTerra/{{models.terra.default_effort}}を標準とする。\n- 同じ方法で複数件を取る場合、子が最初の代表1件で取得先・応答項目・型・対象を確認してから展開する。200応答でも必須項目がなければ、その値は確認できていない。404・403・省略された項目・null・0・空配列を同じ「なし」にまとめず、取得状態と実値を区別する。親の再取得を必須化せず、親は重要判断や矛盾のある部分の根拠を確認する。\n- 全件nullや予想外の0件、資料にある実体が見つからない場合は、参照先・絞込み条件・取得範囲を一度照合する。明白な抽出箇所の訂正で解決できれば担当内で直し、なお不明・矛盾が残るなら取得済み結果と未取得理由を親へ返す。HTTP成功や検索結果なしだけを、対象の不存在・安全性の根拠にしない。\n- Lunaへの取得依頼から、失効した成果物の復元、新規の依存環境構築や未指定の再ビルド、原因推定、複数履歴の統合へ進む必要が出たら、代替作業へ着手する前に親へ戻す。親が必要性を判断し、通常は親Terra/{{models.terra.default_effort}}が引き取り、前提や能力の境界が変われば対応表でモデルを見直す。検証済みの既存コマンドを指定環境で実行する仕事はLunaの候補に残し、effortは有効な固定値を使う。権限・ログインの問題はモデルを変えれば解決すると扱わない。\n- タイムゾーン・再開区間・親子の所属・累積値を扱う集計処理の新規実装や修正は、定型抽出と分けてTerra/{{models.terra.default_effort}}を標準とし、集計定義の矛盾や前提自体を判断する場合はSol/{{models.sol.default_effort}}を候補にする。Lunaは検証済み処理を指定対象に実行し、決まった項目を返す範囲に使える。期間の集計では日時型、明示したID、開始前からの継続と新規開始、進行中と完了、欠測・resetを分ける。件数やモデル比率は元の各行と親子関係へ戻して確認し、自己申告の合計だけを採用しない。\n", + "policy_escalation": "### 親への返却と専門担当への再配分\n\n担当外の判断、設計変更、承認境界、重大な影響、矛盾、検証不能を検出したら根拠と残作業を親へ返す。具体的な修正・妥当な仮説の検証を行っても同じ問題や新情報のない状態が続く時は再評価し、無意味に2回試す義務はない。\n\n親が下位モデルでもSol/Astra、または有効なChat経路の6 Proへ直接渡してよい。順番に一段ずつ上げない。問題分割や合格条件の設計が難しければ、その工程自体を専門担当へ任せる。根拠・前提・反例を回収し、未実施の専門レビューを済みとしない。\n\n権限・接続・ログイン・資料不足は能力不足と区別する。必要な委譲をホストの指示や機能が許さなければ、実施可能な部分と未解決点を報告し、別CLI等で迂回しない。子は親へ返すのを既定とし、Chatへの再委譲はしない。\n", + "policy_handoff": "### 専門工程の委譲と引継ぎ\n\n- 通常工程は親で完結し、専門工程を必要な担当へまとめて渡す。親の選択は維持し、重要な専門判断は担当の根拠・前提・反例・未解決点を確認して受け入れる。元の依頼と重要制約を保持し、誤った要約や分割を子が訂正できるようにする。\n- 再読込み・説明・レビューの負担が節約を上回る短い残作業は現在のモデルで完了してよい。新しい根拠なしにモデルを往復させない。\n- 別コンテキストへ実際に委譲する時、目的、決定事項と理由、対象ファイル/URL/branch・worktree、確認済み根拠と未解決点、受入条件・検証方法、既存の承認範囲、親へ戻す条件を必要十分に渡す。既知のOS・権限・sandbox等の制約と、利用可能な検証環境も短く添える。秘密値は含めない。\n- repo作業の引継ぎには絶対cwd、期待するrepo/worktree・branch・HEAD、対象ファイルの未commit差分の有無と識別を既知の範囲で添える。子は最初から指定cwdを明示して、対象repoの場所・branch/HEAD・statusを確認し、既知の差分と照合してから探索・検証・編集する。detached HEADは期待値と一致すれば問題ない。指定先が存在しない、または予期しない不一致が残る場合は根拠を親へ返し、別worktreeを探し回る、reflogから復元する、checkout/resetで合わせる等へ勝手に広げない。Git外の仕事にGit確認を追加する必要はない。\n- 検証結果はコマンドまたは確認方法、cwd・関係する環境、終了コードと結果、実行時刻、検証したrevisionと未commitの対象差分の識別、証拠の場所を必要な範囲で渡す。HEADだけで未commit変更を検証済みと扱わない。対象ファイルのhashまたは秘密を含まない保存diffで同一性を示せばよく、無関係なファイルを集めない。読み取り調査なら出典・取得時刻・必要な結果への参照でよい。\n- 証拠は作業先の既存artifact領域に、秘匿値を除いた要約・必要なログ、または再参照できる既存ツール結果の場所として残す。保存漏れだけを理由に完了したテストを再実行せず、利用できる実行結果を保存・参照する。秘密情報を避けて必要な証拠を残せなければ、欠測と制約を報告する。\n- 親は重要な根拠と差分、検証対象・実行条件・受入条件の一致を確認して結果を再利用する。関連ファイルや条件の変更、結果の失敗・不十分さ、必須チェックの未実施があれば必要な範囲を追加検証する。必須チェックや重要レビューを省略せず、理由なく全件を再実施しない。検証完了後の不要な手直しで再検証を増やさない。\n- 共通の短い記入例は同じ有効方針ディレクトリの `model-routing-handoff.md`。必要な項目だけ使い、ユーザーへの回答に毎回フォームを出さない。\n", + "policy_reasoning": "### 作業内で使う推論強度と実行条件\n\nモデルは担当能力と必要ツールから先に選び、子のeffortは有効なdefault_effortを明示する。既定はLuna/{{models.luna.default_effort}}、Sol/{{models.sol.default_effort}}、Astra/{{models.astra.default_effort}}。Terra/{{models.terra.default_effort}}は親の基準と互換定義で、Terra子は標準ルート外。実際の親設定は変更しない。\n\nモデルIDはLuna={{models.luna.id}}、Terra={{models.terra.id}}、Sol={{models.sol.id}}、Astra={{models.astra.id}}。通常ChatはUIの6 Proを選び、Codex effortへ換算しない。要求した設定と実際の観測を分ける。API単価をCodex契約の消費率へ代入しない。\n\n子の推論・検証を十分に使い、通常の修正も同じ担当で完結する。品質不足を親の全面的な再処理で隠さず、入力・環境・担当の問題を分けて戻す。設定統一のために実行中の子を止めたり、完了済みの仕事を再実行したりしない。\n", + "policy_parent": "### 親会話の選択と専門判断\n\n親の選択は利用者、承認済み工程内の担当選定はAIが行う。基準運用の親Terraは受付専用ではなく、通常の調査・実装・検証・進行を直接行う。別モデル親を選んだ場合も設定は維持する。\n\n親は進行と結果の取りまとめを担うが、すべての専門判断を独力で再証明する役ではない。専門担当の根拠・前提・反例・検証結果を合格条件と照合する。自己申告だけで承認せず、矛盾・重大な未解決点は担当へ返す。必要な人の承認を代替しない。\n\n標準サブエージェントの実行時機能を確認し、model/effortを明示する。親の保存設定・service_tier・フック信頼・認証を変更しない。追加プラグイン、モデルAPI、別CLIセッションで能力や制約を迂回しない。\n", + "policy_hierarchy": "### 並列分担と直列の専門委譲\n\n既定は親から担当へ1段、同時に委譲する工程はChatを含め原則1件。通常のTerra向け工程は親で完結し、Terra子を標準にしない。既存の他モデル親やoverrideを保持し、必要な能力に合わせる。大きな文脈分離のためのTerra子は将来の明示例外候補で、初期比較に混ぜない。\n\n並列分担では、子の工程が独立し、親にも別の有用な作業が必要。直列の専門委譲では、必要な判断能力や別の利用環境による追加価値、まとまった合格条件、引継ぎの妥当性を示し、ホストの上位指示・機能が直列委譲を許すことを確認する。許可不明は許可済みにしない。上位指示が親の独立作業を必須にする場合はその条件を優先し、架空の親作業や別CLIで迂回しない。\n\n子へは取得・処理/実装・承認済み通常修正・検証・証拠整理・報告までを完了単位として渡す。親は委譲した探索・実装を先回りしない。独立作業が完了したら適切に待機し、頻繁な状態取得や進捗再報告を増やさない。必要なユーザーへの連絡は維持する。\n\n子からの再委譲は標準にせず親へ返す。Chatはrootだけから利用し、深い階層や伝言係を作らない。単純に直列化・階層化したことを節約の証拠としない。\n", + "policy_economy": "### 子への割当てと節約の条件\n\n節約は「子の消費が小さい」ことではなく、親から減らせた処理が、子の処理・引継ぎ・追加検収・手戻りを上回るかで判断する。子のeffortはまず固定し、開始モデル・担当範囲・Chatへの分類による差を比較する。小さな工程を移して親子双方の説明や再読を増やさない。\n\n有効な6 Pro経路は適合工程の主要担当として使い、最後の確認だけに温存しない。一方、利用率・メッセージ消化を目標にせず、同じ分析をAstraで全面的にやり直さない。高影響、矛盾、前提変更、証拠不足に追加レビューを絞る。\n\n同程度の仕事・同じ合格条件で、Astra親の従来構成とTerra親の新構成を比較する。短い通常仕事はTerra単独も基準にする。Codex親子合計・Chatメッセージ・追加クレジット・品質・人の修正を分ける。モデルの割合は絶対量の削減の証拠ではなく、取得不能な使用量は理由付き不明とする。測定だけの追加仕事は作らない。\n", "policy_observation": "### 利用負担の観測\n\n- 品質を保ちながら契約の利用負担と総トークンを抑えることが目的。速度、モデル比率、effortの均等化を成績にせず、引継ぎ・確認・手直しを含めて評価する。少ない総トークンと低い契約負担を同一視しない。\n- 開始時フックの観測状態を使い、方針内容ごとに通常作業3件までを対象とする。設定修正・監査・実行確認・短い質問は算入しない。残枠があれば、まとまった通常作業の着手時に `observation start` で予約する。記録先と具体的なCLIはフックとスキルの `references/observation.md` を参照。プラグイン版だけの変更では観測を再開しない。\n- startが返すsampling_keyをtask_idと一組で保持する。task_idはルート親と作業開始turnなどから決めた安定したキー。同じ作業の再開・子・孫を別の通常作業として数えない。起動時はtask_id、直接親/root、返却された子task名とID、要求model/effort・理由、開始時刻と起動結果の参照を、既存の引継ぎと一緒に控える。task名をUUIDとして扱わず、取得不能なIDは理由付きnull。子には同じtask_id・sampling_keyと結果の返却先を渡す。\n- 子は担当範囲の検証結果・手直し・実行情報を完了報告に添える。親は新規起動と再開turnを分けて親子の一組の記録へまとめ、最終報告前に `observation complete` で更新する。子の自己申告や親の現在設定を実行値の証明にせず、要求値と根拠付きの観測値を分離する。完了後の短い修正も同じ記録を更新する。\n- 記録には対象範囲、実行状態、親子の対応、取得できた使用量と証拠参照、検証結果、手直しを含める。取得できた項目は残し、不足項目はnullと理由にする。進行中の親turnの最終使用量は未確定のまま記録を閉じてよい。記録完了は作業全体の実測が揃ったことを意味しない。後の同じタスクの再開で既存の完了データを取得できる時だけ追記し、取得のためにタスク・子・再検証を起動しない。\n- 完了turnの利用量は単一ログ内で最初の応答より前の開始基準と完了値が対応し、対象区間に欠測・reset・必須カウンターの不整合がない場合だけ全量として扱う。最初の応答後の累積値から引くと初回分が抜ける。途中区間はpartial_turnとして全量と区別し、未完了の値を完了量へ含めない。cached inputはinputの内数、reasoningはoutputの内数として二重加算しない。\n- このプラグインは会話ログ・DB・認証情報を収集しない。取得可能な実行結果か、許可済みの指定ID・turnに絞った実行メタデータを使う。全履歴の探索、暗号文の複製・文字数計測、測定器の大規模な修復はしない。既存結果を再利用し、補助取得は一度で打ち切り、不足は理由を残す。\n- 同じ条件の比較基準と作業全体の親子の測定範囲が揃わなければ節約率は不明。親子の包含範囲が未確認なら合算しない。API料金やアカウント共通の週次使用率を個別作業へ換算しない。操作件数だけで不要な往復とは判断せず、同じrevision・方法・対象を理由なく繰り返した証拠を確認する。\n- 台帳の破損や権限不足は観測状態unknownとして扱い、空の台帳で上書きしない。元の仕事と分担方針の適用は続け、観測だけを理由に停止しない。通常3件の枠を使い切ったら新規記録を作らず、既存記録の不足だけを対象タスクの通常進行中に補う。\n", "policy_scope": "### 保存先・適用範囲\n\n- 同じ有効方針ディレクトリのeffective.mdを要約、この文書を詳細分類の正本とする。有効かつ信頼済みのプラグインフックで開始・再開時に読み込む。既存セッションは再読込みが必要な場合があり、別PC・別CODEX_HOME・クラウド環境への自動同期は前提にしない。より優先される指示・適用されるプロジェクト指示に従う。\n- 分類は運用開始時の基準。ユーザーの修正指示や実測で調整し、モデル更新・利用可否変更時は公式情報と現在の環境を確認する。具体例は `model-routing-catalog.md` に集約し、この文書の一般条件と矛盾させない。繰り返す誤分類や手戻りが分かったら該当する分類を修正・統合し、一度きりの事例のために毎回項目を増やさない。\n- 参考:OpenAI Docsのモデル一覧 https://developers.openai.com/api/docs/models 、effort・Max・Ultraの説明 https://learn.chatgpt.com/docs/models?surface=app 、共通指示の仕様 https://learn.chatgpt.com/docs/agent-configuration/agents-md 、標準のサブエージェント仕様 https://learn.chatgpt.com/docs/agent-configuration/subagents (2026-09-13確認)。\n" } diff --git a/plugins/codex-task-routing/defaults/provenance.json b/plugins/codex-task-routing/defaults/provenance.json index b95d687..c8d79ed 100644 --- a/plugins/codex-task-routing/defaults/provenance.json +++ b/plugins/codex-task-routing/defaults/provenance.json @@ -1,5 +1,5 @@ { - "policy_revision": "2026-09-14-observation-completion", + "policy_revision": "2026-09-15-terra-chat-fixed", "source_sha256": { "AGENTS.md": "bd2584d350c204f1ffbc8c005c084fc34360acddf8812557504350820e34be42", "model-routing-policy.md": "9335ccec4516bc71b68d01f9304d6e71d3b5efcd77a210476571cd7d060c476c", @@ -13,7 +13,13 @@ "remove redundant Japanese effort labels to prevent stale labels after override", "parameterize model ids and supported effort slots; default roundtrip verified", "bounded observation lifecycle with explicit missing usage and unchanged model defaults", - "0.6.0 conditional Chat-first suitability decision in catalog; native model and effort defaults unchanged" + "0.6.0 conditional Chat-first suitability decision in catalog; native model and effort defaults unchanged", + "0.8.0 intentional policy change: Terra parent reference, fixed effective efforts, capability-based Chat-first and host-gated serial specialists; historical source hashes retained" ], - "source_policy_revision": "2026-09-14" + "source_policy_revision": "2026-09-14", + "rendered_sha256": { + "model-routing-policy.md": "45758dc504e64213e4bc2277a288d58c24e48ad194ae150153965c593a53958e", + "model-routing-catalog.md": "9405d71f6f1c1c5c908ccee8ac88e948d54eb5b453816a3baed2cd8dc639d70a", + "model-routing-handoff.md": "9d9a33295c2fa06e6593a3b1350017335ac91d70f26294417747c34cfc545e06" + } } diff --git a/plugins/codex-task-routing/defaults/templates/effective.md b/plugins/codex-task-routing/defaults/templates/effective.md index ab91ad2..c130df6 100644 --- a/plugins/codex-task-routing/defaults/templates/effective.md +++ b/plugins/codex-task-routing/defaults/templates/effective.md @@ -1,14 +1,13 @@ # Codex Task Routing — 有効方針 -これは利用者が導入した既定の分担運用です。上位指示・実行機能・ユーザーの明示指定と承認を優先し、親の設定を変更しません。個別の上書きは対応する既定を置き換えます。原則の要約と関連する詳細節の整合も確認してください。 - -上書きで範囲を変更した場合も、条件別の候補は有効な下限・上限の内側でだけ適用します。範囲外の固定候補が残る場合は親へ返し、必要な深さと許容範囲を両立できる担当を選び直します。 - -| 役割 | model ID | 下限 | 標準 | 上限 | -| --- | --- | --- | --- | --- | -| Luna | {{models.luna.id}} | {{models.luna.min_effort}} | {{models.luna.default_effort}} | {{models.luna.max_effort}} | -| Terra | {{models.terra.id}} | {{models.terra.min_effort}} | {{models.terra.default_effort}} | {{models.terra.max_effort}} | -| Sol | {{models.sol.id}} | {{models.sol.min_effort}} | {{models.sol.default_effort}} | {{models.sol.max_effort}} | -| Astra子 | {{models.astra.id}} | {{models.astra.min_effort}} | {{models.astra.default_effort}} | {{models.astra.max_effort}} | +上位指示・実行機能・利用者の明示指定と承認を優先し、親設定は変更しません。default_effortが自動選定の固定値です。min_effort/max_effortは既存overrideの範囲検証用で、毎回の選択候補ではありません。 + +| 担当 | model ID | 有効な固定値 | +| --- | --- | --- | +| Luna子 | {{models.luna.id}} | {{models.luna.default_effort}} | +| Sol子 | {{models.sol.id}} | {{models.sol.default_effort}} | +| Astra子 | {{models.astra.id}} | {{models.astra.default_effort}} | +| Terra(親の基準・互換定義、子は標準外) | {{models.terra.id}} | {{models.terra.default_effort}} | +| 通常Chat | UIで6 Pro | 別経路・Codex effortと換算しない | {{principles.summary}} diff --git a/plugins/codex-task-routing/defaults/templates/model-routing-catalog.md b/plugins/codex-task-routing/defaults/templates/model-routing-catalog.md index bfe9fb5..c1d20a6 100644 --- a/plugins/codex-task-routing/defaults/templates/model-routing-catalog.md +++ b/plugins/codex-task-routing/defaults/templates/model-routing-catalog.md @@ -1,113 +1,42 @@ -# 具体的な仕事の分類表(2026-09-14・節約優先) +# 作業分類表 — 固定effortと通常Chat優先 -## 通常Chatが有効な場合の優先判定 +この表は担当候補であり、親の設定変更・送信・外部書込みの許可ではない。短い通常作業は親で終える。基準運用は親Terra/{{models.terra.default_effort}}、子はLuna/{{models.luna.default_effort}}・Sol/{{models.sol.default_effort}}・Astra/{{models.astra.default_effort}}。Terra子は標準ルート外。既存overrideの有効な固定値を使う。 -開始時フックが通常Chat経路を有効と示した場合だけ、rootは下表の通常子を選ぶ前にChatへの適合を検討する。承認済みの材料とChat側で確認したツールで完結する、まとまった比較・分析・反証・設計・文案・レビューは6 Proを優先候補とする。毎回のプラグイン指定は不要。難しい判断だけを理由にSolやAstraへ固定しない。 +## 選定の順序 -開発・運用という仕事名で全体をCodexへ固定せず、Codexで証拠取得→Chatで分析・設計→Codexで実装・検証のように必要な工程を分ける。準備・待ち時間・受入・手戻りが見合わない短い仕事、頻繁な現物照会は現在の担当で進める。親にも実際の独立作業が必要であり、待つだけの委譲はしない。 +まとまった工程では、Chat経路が有効であれば6 Proを最初の主担当候補にする。難問だけに限定せず、必要情報・実ツール・対象権限・検証環境でその工程を完結できるかを見る。短い残作業、Codex側の現物への頻繁な照会、機密を渡せない場合、準備・検収が過大な場合はCodexに残し、理由を一言残す。上位モデルから下位へ、または下位から上位へ順番に試す必要はない。 -Chatの有効化だけで非公開資料の送信や接続の権限が増えることはない。必要情報・出典と鮮度・許可ツール・返却形式・停止条件をそろえ、開始時フックが示すChat手順で能力確認と送受信を行う。Chat経路が無効、未確認又は不適合なら理由を短く残し、下表の既存model/effort選定を使う。子からChatへ再委譲しない。 +並列分担は親にも有用な独立作業が必要。直列の専門委譲は具体的な追加価値とホストの許可を確認する。許可不明・禁止なら起動せず、不要な親の仕事や別CLIで条件を迂回しない。 -繰り返す担当選びを減らすための第一候補。品質を保ちながら時間短縮より総トークン数・利用負担の削減を優先し、引継ぎ・確認・手戻りを含めて選ぶ。性能・価格・節約率を実証した表ではなく、同じディレクトリの `model-routing-policy.md` に従う運用上の既定値である。見出しを検索して該当分野の一節だけ読む(目安20〜40行)。有効な既読条件は再利用する。下表は新規割当て・能力や範囲が変わった時の候補であり、工程ごとに担当を切り替える指示ではない。同じ仕事の続きや短い検証は能力の足りる既存担当を優先し、短い残作業だけのために新規起動しない。Lunaのために親が解法を作り込む必要がある通常工程はTerra、複雑な矛盾解消を含む工程はSolを検討する。安い順の試行や子の利用件数を目標にしない。 +## 調査・文書・事務 -| モデル | 下限 | 標準 | 上限 | 選択の要点 | -| --- | --- | --- | --- | --- | -| Luna | {{models.luna.min_effort}} | {{models.luna.default_effort}} | {{models.luna.max_effort}} | {{models.luna.min_effort}}は全固定条件を満たす機械照合だけ。指定資料抽出、既知パターン探索、一意の局所修正、取り違え防止は{{models.luna.default_effort}}。 | -| Terra | {{models.terra.min_effort}} | {{models.terra.default_effort}} | {{models.terra.max_effort}} | {{models.terra.min_effort}}は原因・方針が確定した小変更や限定比較、{{models.terra.default_effort}}は通常の調査・実装・検証、{{models.terra.max_effort}}は前提確定後に多数の境界条件・組合せを深く詰める工程。 | -| Sol | {{models.sol.min_effort}} | {{models.sol.default_effort}} | {{models.sol.max_effort}} | {{models.sol.min_effort}}は論点・対象・受入条件が明確な限定調査・レビュー、{{models.sol.default_effort}}は複数モジュール整合や難しい原因・互換性・重要レビュー、{{models.sol.max_effort}}は設計前提の再検討や複雑因果・反証。 | +| 作業条件 | 候補と合格条件 | +| --- | --- | +| 指定原文の項目取得、抽出、固定列の照合 | 親、またはまとまった工程はLuna。対象・必要項目・ページング・0件と未取得の区別を固定 | +| 公開情報・承認済み接続先の調査・比較 | 実取得ツールが使える6 Proを優先。出典・対象版・日付・確認範囲・未取得を返す | +| 要件整理、分析、設計、矛盾・反例の検討 | 6 Proを主担当候補。利用不能なら通常は親、複雑な整合はSol、難しい前提はAstra | +| 文案・翻訳・報告書・資料レビュー | まとまった工程は6 Pro。短い整形は親。高影響の表現は根拠と承認を確認 | +| 帳票の網羅確認、日付や欠測の解釈 | 原本を実見できる親Terraまたは6 Pro。OCR空欄だけで記載なしとしない | +| 認証・課金・税務・個人情報に関する判断 | 事実取得と重要判断を分離。適任の専門判断・最新の公式根拠・必要な人の承認を省略しない | -- Lunaの原則は{{models.luna.default_effort}}で、{{models.luna.min_effort}}が下限である。{{models.luna.min_effort}}は **固定手順・固定入力・固定期待値・機械的な正誤照合・解釈不要・低影響** をすべて満たす時だけ選ぶ。指定資料の抽出、既知パターンの探索、一意で低影響な局所修正、対応関係の取り違え防止は{{models.luna.default_effort}}を選ぶ。意味の解釈、画像の実見や目視評価は機械照合に含めない。未知環境への構築・復元や原因推定が必要なら着手前に親へ戻し、Lunaの担当範囲をeffortで補わない。Lunaは有効な下限未満・上限超を使わない。件数・長時間実行・複数手順だけでは上げない。 -- Terraの原則は{{models.terra.default_effort}}で、下限は{{models.terra.min_effort}}、上限は{{models.terra.max_effort}}である。原因と方針が確定した小変更、既定条件での限定比較、未知依存や例外が少ない仕事は{{models.terra.min_effort}}にする。通常の調査・実装・検証、原本の全件確認、日付の意味の区別、曖昧な分類、欠測の解釈は{{models.terra.default_effort}}にする。設計と担当範囲が確定し、多数の境界条件や組合せを深く詰める必要がある時だけ{{models.terra.max_effort}}にする。Terraは有効な下限未満・上限超を使わない。作業量だけでは上げない。 -- Solの原則は{{models.sol.default_effort}}で、下限は{{models.sol.min_effort}}、上限は{{models.sol.max_effort}}である。Solの理解力を要するが、論点・対象・受入条件が明確で広い探索を要しない限定調査・レビューは{{models.sol.min_effort}}にする。複数モジュールの整合、難しい不具合、互換性、矛盾した証拠、重要レビューは{{models.sol.default_effort}}にする。設計前提の再検討、複雑な因果、難しい反証や競合条件は{{models.sol.max_effort}}にする。Solは有効な下限未満・上限超を自動選定しない。モデルの能力境界をeffortで越えず、Astra親が初期方針、設計変更・重大判断、最後の重要根拠と受入確認を担う。 -- low・none・minimal・Ultraは自動選定しない。ユーザーが選んだ親のmodel・effortは維持する。再開時は要求と実際に観測したmodel・effortを分け、設定が未知なら確認済みとしない。必要な設定・実行条件を満たせない場合は正本に従って未完了分だけ再配分し、観測の欠測だけで新規起動を増やさない。 -- 直接の子は同時に原則1体。階層を明示した時はTerra1体とそのLuna1体までを目安とする。親にも独立して進める有用な仕事がある時だけ子を起動し、並列化自体を目的にしない。純粋な伝言係を置かず、待つだけの委譲のために仕事を捏造しない。 -- 階層委譲は既定で一段。範囲のまとまった工程は、下表の作業条件に合うeffortのTerraに実装と進行を含めて任せられる。親が明示した工程内だけ、TerraからLunaへ1段追加できる(root Astra→Terra→Luna、最大2辺)。追加子にも独立した作業・入力・合格条件と、その直接の親にも独立した有用な仕事が必要で、孫の再委譲は禁止する。機能・上位指示が許さない場合は既存の担当へ戻し、正本の階層条件に従う。 -- 表の担当は実作業の候補であり、承認・公開・本番操作の範囲を広げない。子にはmodel・effortと選定理由、対象、根拠、合格条件、検証環境、承認範囲、再委譲可否、親へ戻す条件を明示する。上限を超える難しさは安い順に試さず親へ戻す。手戻りを含む総負担を測定していないため、同等性能や節約率は保証しない。 +## 実装・運用・PR -各行の「確認方法・完了条件」は、指定範囲の確認・依頼された保存・必要な検証・結果報告までを指す。「保存」は依頼された成果物や必要な証拠が対象で、回答だけで済む仕事に新規ファイルを作らない。既存の再参照できる結果も使い、観点ごとに別ログを増やさない。秘密値や不要な原本全文をログへ残さず、依頼された処理と必要な証拠に範囲を絞る。未掲載の仕事は正本の近い条件で判断する。矛盾・影響拡大・繰り返す失敗・検証不能は親へ返し、権限やログイン不足をモデル変更で解決しない。画像の実閲覧、必須スキル・ツール、既存の承認範囲を守る。 +| 作業条件 | 候補と合格条件 | +| --- | --- | +| 一意の局所修正、通常の実装・検証 | 親Terraで完結。少量の仕事を別のTerraへ渡さない | +| 既知手順のまとまった取得・処理・テスト実行 | Luna。異常原因の推定・未知の環境構築は親へ返す | +| Chat側にrepoの取得・編集・テスト・PR作成の実機能がある | 明示承認された工程を6 Proの候補にする。Chatだから実装不可と決めない | +| 分析とローカル実行が分離できる | Codexで証拠取得→6 Proで判断→親または専門子で実装・検証。細かい往復を増やさない | +| Codex側の編集・テスト・新規ログ確認が密に反復する | 複雑な工程はSol。難しい設計前提・重大な不確実性はAstra | +| DB移行、本番変更、セキュリティ境界、不可逆な操作 | 専門判断・復旧条件・受入証拠・明示承認を確認。PR作成はマージや配備の許可ではない | +| 必要な実機・接続・権限がない | 未検証範囲を明示して返す。別環境のテストを実機検証と扱わない | -## 調査・情報収集 +Chatへ実装を任せる時は、repo・base/head・対象範囲、許可するcreate/update/commit/PR等の操作、テスト環境・合格条件をtaskとhandoffへ明示する。機能の提供、対象権限、今回の承認は別々に確認する。承認されない試験書込みで権限確認しない。マージは明示許可とCI・レビュー・対象SHA確認がある場合だけ。現物アクセス不足を別の仕事の成果で埋めない。 -| 条件付き作業 | 第一候補 | 確認方法・完了条件 | 親へ戻す境界 | -| --- | --- | --- | --- | -| 指定した公式ページから現行の項目・版・価格表記を抜き出す。対象URL・項目・期待形式が固定 | Luna/{{models.luna.min_effort}}(全固定条件を満たす時); それ以外は{{models.luna.default_effort}} | 指定箇所と必須項目を機械照合し、出典リンク付き一覧を保存 | 出典が矛盾する、意味の解釈が必要、取得条件が不明 | -| 決めた検索語・期間・列で複数資料の事実を一覧化する | Luna/{{models.luna.default_effort}} | 各資料・各必須列を対象範囲と照合し、一覧を保存 | 対象の選び方や比較軸を決める必要 | -| 請求書・PDF・スキャン等の必須項目・記載なしを原本で確認する。混在レイアウトや発行日・利用期間・決済日の意味を区別して抽出する場合も含む | Terra/{{models.terra.default_effort}} | OCRや本文が空でも対象ページ全体(ヘッダ、フッタ、隅)を実見し、必要時に拡大。見出し・値・原本位置を全件保存し、発行日を取引日に変換しない | 判読不能、対象資料の意味が曖昧、定義変更、原本と補助情報が矛盾 | -| 曖昧なメール・文書を指定分類に仕分け、例外・欠測を解釈する | Terra/{{models.terra.default_effort}} | 分類根拠と「未確認/判読不能/見つからない/確認範囲内で記載なし」を分けて保存 | 分類規則を新設・変更する必要、重要な対外又は業務判断 | -| 検証済みの分類規則を、固定対象・固定出力に機械適用する | Luna/{{models.luna.min_effort}}(全固定条件を満たす時); それ以外は{{models.luna.default_effort}} | 規則版・対象件数・各出力を機械照合し、結果を保存 | 新しい例外又は規則外の入力がある | -| 指定URL・PR・チケットの固定状態とリンクを確認する | Luna/{{models.luna.min_effort}}(対象・期待状態・照合方法が固定); それ以外は{{models.luna.default_effort}} | 対象IDごとの状態とリンクを期待値に照合し、一覧を保存 | 状態の妥当性や次の対応を判断する必要 | -| 少数の候補を既定条件で比較し差分を説明する | Terra/{{models.terra.min_effort}} | 比較表に入力・基準・差分を保存し、指定観点を完了報告で照合 | 重み付け、事業・安全性の選択が必要 | -| 単一機能内の資料・ログの食い違いを原因候補ごとに検証する | Terra/{{models.terra.default_effort}} | 仮説ごとに出典・確認結果・未確認範囲を保存し、反証の有無を報告 | 複数サービスの矛盾解消・複雑な因果関係ならSol/{{models.sol.default_effort}}を候補に再評価 | +## 画像・成果物・データ -## 文章・翻訳 +画像は実際に閲覧できる担当と専用ツールを使う。固定項目の照合と意味・原因判断を分け、正確な寸法・色値・画素差は測定する。資料・表計算の成果物は内容だけでなく表示・式・対象範囲も必要に応じて検証する。全件確認が必要な項目を代表確認で代替しない。数値の合計だけで取得網羅性や親子の使用量範囲を証明しない。 -| 条件付き作業 | 第一候補 | 確認方法・完了条件 | 親へ戻す境界 | -| --- | --- | --- | --- | -| 与えられた文の通常翻訳、要約、既定トーンへの整形 | Luna/{{models.luna.default_effort}} | 入力全文・指定言語/トーン・出力形式を照合し、完成文を保存 | 法務・契約・高影響の意味を確定する必要 | -| 決まったテンプレートに会議メモ・手順・リリースノートを転記する | Luna/{{models.luna.default_effort}} | 必須欄・出典・テンプレート版を照合し、完成版を保存 | 構成や事実関係を新たに選ぶ必要 | -| 既存文面の誤字・表記ゆれ・指定用語を定型校正する | Luna/{{models.luna.default_effort}} | 指定ルールと変更箇所を照合し、校正版を保存 | 主張の正確性、対外影響を評価する必要 | -| 複数資料を読んで提案書・説明文の論点と構成を作る | Terra/{{models.terra.default_effort}} | 資料根拠と各論点を対応付け、指定読者・構成を満たす原稿を保存 | 方針、交渉、公開判断を含む | +## 受入と再配分 -## 表計算・データ - -| 条件付き作業 | 第一候補 | 確認方法・完了条件 | 親へ戻す境界 | -| --- | --- | --- | --- | -| 指定ファイルから固定列を抽出、形式変換、重複照合する | Luna/{{models.luna.min_effort}}(全固定条件を満たす時); それ以外は{{models.luna.default_effort}} | 入出力件数・固定列・重複規則を照合し、結果を保存 | 定義不明、欠損の扱いを決める必要 | -| 既存の検証済み集計を指定期間・IDで実行し結果を報告する | Luna/{{models.luna.min_effort}}(固定期間・ID・既存手順・期待形式); それ以外は{{models.luna.default_effort}} | 手順版・期間・ID・期待形式を照合し、実行結果を保存 | 集計ロジックや期間境界を変更する必要 | -| 既定ルールで件数・合計・差分・hashを照合する | Luna/{{models.luna.min_effort}}(固定ルールと期待値); それ以外は{{models.luna.default_effort}} | 規則版・入力範囲・期待値・実値を機械照合し、結果を保存 | 数値の意味や異常原因を解釈する必要 | -| データ定義、結合、集計式、可視化の設計を行う | Terra/{{models.terra.default_effort}} | 定義・式・入出力例を指定要件に照合し、設計又は成果物を保存 | 会計・法務・重要な意思決定の結論を出す | -| 欠測、タイムゾーン、累積値、複数系統の不整合を調査する | Terra/{{models.terra.default_effort}} | 系統ごとの範囲・定義・再現結果を保存し、欠測と不一致を分けて報告 | 基幹データの修正や高影響の判断が必要 | - -## コード・テスト - -| 条件付き作業 | 第一候補 | 確認方法・完了条件 | 親へ戻す境界 | -| --- | --- | --- | --- | -| 指定ファイルの定数・参照箇所・既知パターンを探索する | Luna/{{models.luna.default_effort}} | 検索範囲と一致箇所を保存し、対象ファイルを漏れなく列挙 | 仕様や依存関係の解釈が必要 | -| 内容が一意で低影響の局所修正、入力と期待結果が決まった既存パターンのテスト追加 | Luna/{{models.luna.default_effort}} | 指定差分と既存パターンを照合し、対象テスト又は固定確認を保存 | 仕様や検証観点を選ぶ必要、設定・依存・権限等への影響拡大 | -| 既存コマンドで単体・結合・E2Eテストを実行し合否を照合する | Luna/{{models.luna.min_effort}}(手順・入力・期待結果が固定); それ以外は{{models.luna.default_effort}} | 対象revision・コマンド・成功/失敗/skipを固定判定規則と照合して保存 | テスト設計、失敗原因、環境差を判断する必要 | -| 原因と対処方針が確認済みで、未知依存・例外が少ない単一機能の局所修正を実装する | Terra/{{models.terra.min_effort}} | 確認済みの原因・方針・受入条件に対応する差分と検証結果を保存 | 原因又は方針が未確定、設計前提・互換性・複数モジュールの判断が必要 | -| 受入条件が明確な機能、UI、限定リファクタリングを通常の調査・実装・検証まで行う | Terra/{{models.terra.default_effort}} | 受入条件に対応する差分と必要な検証結果を保存 | 設計と担当範囲が確定したまま、多数の境界条件・組合せを深く詰める必要がある時はTerra/{{models.terra.max_effort}} | -| 設計と担当範囲は確定しているが、多数の互換性条件・境界値・組合せを深く詰める実装又はテスト設計 | Terra/{{models.terra.max_effort}} | 条件表・影響境界・検証観点を明示し、関連結果を保存 | 前提自体の再検討、複数モジュールの原因判断、競合条件の反証が必要 | -| 複数モジュールにまたがる互換性修正、根因が難しい不具合、矛盾証拠を含む重要レビュー | Sol/{{models.sol.default_effort}} | 影響境界・原因根拠・互換性条件・検証観点を明示し、関連結果を保存 | 設計前提の再検討、複雑な因果、難しい反証又は競合条件が必要ならSol/{{models.sol.max_effort}} | -| 設計前提を再検討し、複雑な因果や競合条件を反証して解く必要がある実装・レビュー | Sol/{{models.sol.max_effort}} | 前提、反証候補、競合条件、受入根拠を対応付けて保存 | 重大判断、承認、専門確認はAstra親へ戻す | - -## 画像・UI・資料 - -| 条件付き作業 | 第一候補 | 確認方法・完了条件 | 親へ戻す境界 | -| --- | --- | --- | --- | -| 実画像で指定ラベル、要素、見切れ、基準画像との差を定型確認する | Luna/{{models.luna.default_effort}} | 実画像を開き、候補ラベル・見切れ・指定差分を基準画像と照合して保存 | 改善案、原因、品質基準を新たに判断する必要。画像を実際に閲覧できない時も未確認として親へ返す | -| 既定テンプレートへ画像・数値・文章を差し込み資料を整える | Luna/{{models.luna.default_effort}} | 必須領域・入力値・出力形式を照合し、完成資料を保存 | 構成、表現、ブランド判断を行う必要 | -| 仕様から画面の確認観点、境界値、アクセシビリティ項目を選ぶ | Terra/{{models.terra.default_effort}} | 仕様の各要件を観点・境界値・確認方法に対応付けて保存 | 複数画面の体験設計や優先順位を決める | -| 未知の画面不具合を観察し原因仮説と改善案を整理する | Terra/{{models.terra.default_effort}} | 再現画面・観察事実・仮説・確認結果を保存 | 大規模なデザイン方針・ブランド判断が必要 | -| 既知の画面で固定手順の操作・入力・チェックを行い、指定結果と照合する | Luna/{{models.luna.default_effort}} | 画面条件・操作結果・指定期待値を照合して保存 | 未知の分岐、公開・購入・削除等の判断が発生。専用ツールと承認範囲に従う | - -## Git・CI・配信 - -| 条件付き作業 | 第一候補 | 確認方法・完了条件 | 親へ戻す境界 | -| --- | --- | --- | --- | -| 指定branch・PR・CI・デプロイの固定状態を取得し一覧化する | Luna/{{models.luna.min_effort}}(対象と期待状態が固定); それ以外は{{models.luna.default_effort}} | 対象ID・revision・期待状態を照合し、リンク付き一覧を保存 | マージ可否や配信内容を評価する必要 | -| 既定チェックを実行し、対象revision・成功・失敗・skipを記録する | Luna/{{models.luna.min_effort}}(固定CI・revision・判定規則); それ以外は{{models.luna.default_effort}} | 固定CI・revision・判定規則と実行結果を照合して保存 | 失敗の原因・必要な検証を選ぶ必要 | -| 確認済みの差分を指定ファイルだけcommitし、承認範囲内で既定手順のPR下書きを作る | Luna/{{models.luna.default_effort}} | 指定ファイル・差分・commit・下書き内容を照合し、PRリンクを保存 | 予期しない差分、競合、公開範囲の変更、マージ判断 | -| Solの理解力を要する限定PRレビュー。論点・対象差分・受入条件が明確で広い探索を要しない | Sol/{{models.sol.min_effort}} | 受入条件・差分・検証結果を対応付け、指摘又は承認根拠を保存。既存担当で済む短い確認だけを新規Solへ渡さない | 複数モジュール整合、矛盾証拠、互換性又は重要影響を判断する必要 | -| 通常のPR差分を仕様・回帰・保守性の観点で調査・レビューする | Terra/{{models.terra.default_effort}} | 受入条件・差分・検証結果を対応付け、指摘又は承認根拠を保存 | 複数モジュール整合、難しい原因又は互換性ならSol/{{models.sol.default_effort}}に再評価 | -| PRの重要差分、マージ可否、本番で期待した内容が配信されたかを受入条件で判断する | 親の選択モデル(Astra親なら親) | 差分・CI・配信revision・外部確認を受入条件に照合して根拠を保存 | 親が下位でAstraの確認が必要なら、委譲条件を満たす限定レビューを使う | - -## サーバー運用 - -| 条件付き作業 | 第一候補 | 確認方法・完了条件 | 親へ戻す境界 | -| --- | --- | --- | --- | -| 指定ホストのヘルス、容量、プロセス、監視値を取得する | Luna/{{models.luna.default_effort}} | 指定時刻・対象・値・取得元を保存し、未取得と異常値を分けて報告 | 値の原因や復旧方針を判断する必要 | -| 承認範囲内で低影響・手順固定の可逆操作を実施し結果を確認する | Luna/{{models.luna.default_effort}} | 操作前後の状態と復帰方法を照合し、結果を保存 | 本番変更・削除・権限変更等の影響判断が必要なら着手前に親へ返す | -| 原因と復旧方針が確認済みで、未知依存・例外が少ない単一サービスの障害を修正する | Terra/{{models.terra.min_effort}} | 再現条件・確認済みの原因と方針・ログ/設定根拠・確認結果を保存 | 複数サービス・ネットワーク・認証、又は原因未確定が絡む | -| 既存構成内の難しい障害、複数モジュールの互換性、復旧手順を検討する | Sol/{{models.sol.default_effort}} | 影響・復旧条件・検証計画を保存し、未確定前提を明示 | 設計前提の再検討、データ損失、高影響の本番判断 | - -## 自動化・事務・業務判断 - -| 条件付き作業 | 第一候補 | 確認方法・完了条件 | 親へ戻す境界 | -| --- | --- | --- | --- | -| 既定条件で予定・台帳・タスク・定型連絡の候補や下書きを整える | Luna/{{models.luna.default_effort}} | 指定条件・必須欄・下書き状態を照合し、成果物を保存 | 送信・登録・対外確約へ進むなら既存の承認範囲を確認。未承認分は実行しない | -| 定義済みの条件で監視結果を集め、未達だけを報告する | Luna/{{models.luna.default_effort}} | 定義済み閾値・対象範囲・未達一覧を照合し、結果を保存 | 閾値、例外、対応優先度を変更する必要 | -| 通常の業務フローを比較し、必要な入力・手順・抜けを整理する | Terra/{{models.terra.default_effort}} | 指定フロー・必要入力・差分を対応付け、比較結果を保存 | 会社・契約・税務・人事の意思決定を行う | -| 複雑な料金体系・継続条件・例外を照合し、指定条件で比較根拠を整理する | Sol/{{models.sol.default_effort}} | 条件・例外・出典・比較式を保存し、適用範囲を明示 | 事業上の重要比較・予算・採用方針の決定は親が担当。限定された既定条件の比較はTerra/{{models.terra.min_effort}} | -| 決定済みの入力・分岐・終了条件に沿って通常の自動化を実装する | Terra/{{models.terra.default_effort}} | 決定済み条件と実装・通常経路の検証結果を対応付けて保存 | 再実行・外部書込み・例外処理の設計や影響が当初範囲を超える | -| 要件・構成・優先順位・予算・採用方針を決め、全体の品質とリスクを判断する | 親の選択モデル(Astra親なら親) | 選択肢・根拠・リスク・ユーザー決定を保存し、受入根拠を明示 | 必要な専門確認・ユーザーの決定権を維持。独立した重要レビューだけ適切な子へ | +子の結論・重要差分・証拠・前提・反例・未解決点を受け取る。親の取りまとめと専門判断を分け、同じ分析やテストを理由なく全面再実行しない。設計変更・範囲拡大・矛盾・検証不能・同じ失敗は親へ返す。effortは固定しても担当や合格条件を固定しない。接続・権限・材料不足をモデル変更で解決したと扱わない。 diff --git a/plugins/codex-task-routing/defaults/templates/model-routing-handoff.md b/plugins/codex-task-routing/defaults/templates/model-routing-handoff.md index 8a82336..b7fcf84 100644 --- a/plugins/codex-task-routing/defaults/templates/model-routing-handoff.md +++ b/plugins/codex-task-routing/defaults/templates/model-routing-handoff.md @@ -1,42 +1,23 @@ -# モデルルーティング作業 引継ぎテンプレート +# 引継ぎの最小契約 -不要な項目は省略する。選定・階層・観測の正本は `model-routing-policy.md` の該当見出しを参照し、必要な一節だけ読む。 +フォームのために保存物を増やさず、必要な項目だけ使う。全履歴fork・全ログの転送を避ける。元の依頼・重要な制約・必要な原資料は保持し、誤解を担当が指摘できるようにする。 -## 起動時の引継ぎ +## 共通 -- **設定と理由**: [要求 model/effort と対応表の条件を一言。Lunaは{{models.luna.min_effort}}/{{models.luna.default_effort}}(標準{{models.luna.default_effort}})、Terraは{{models.terra.min_effort}}/{{models.terra.default_effort}}/{{models.terra.max_effort}}(標準{{models.terra.default_effort}})、Solは{{models.sol.min_effort}}/{{models.sol.default_effort}}/{{models.sol.max_effort}}(標準{{models.sol.default_effort}})。実行値は維持と推測しない。指定不能・観測不能は `null` と理由。ユーザーが選んだ親設定は変更しない] -- **目的・成果物・完了単位**: [確定・実装・検証すること、保存先。抽出又は実装 → 依頼された保存 → 必要な検証 → 完了報告までを承認済みの完了単位として進め、途中経過だけで止めない] -- **担当と範囲**: [直接親/root、子の担当範囲、親が並行して担う独立作業、対象ファイル・環境・検証範囲、対象外。再委譲は正本と親の明示した工程内だけ] -- **承認・返却条件**: [許可された読取り・変更・外部操作。取得先の矛盾、解決不能な必須項目欠落、担当・承認範囲外の環境構築・復元・集計ロジック、設計又は影響範囲の変更、承認内の代替がない権限・環境・対象不一致は根拠とともに親へ返す。Lunaの新規構築・復元等の返却条件は正本に従う] -- **根拠・環境・合格条件**: [決定事項とファイル/既存結果/ツール結果ID、cwd・OS・権限・ネットワーク等の制約、受入条件、検証方法。成功・失敗・skip・未実行を分ける] -- **repo 作業時**: [絶対 cwd、期待 repo/worktree・branch/HEAD、既知の対象 diff。指定 cwd で一致を確認し、不一致は別 worktree 探索・checkout・resetへ広げず親へ返す] +目的/担当と固定effort/対象と未解決点/既知の根拠/合格条件/許可済み操作/返却条件を渡す。並列なら親の独立作業、直列なら専門委譲の追加価値とホストが許す根拠を添える。通常作業は親Terra、Terra子は標準外。子は承認済みの通常修正・検証・証拠整理まで同じ担当で進める。 -### 必要な場合だけ追加する条件 +## Codex専門担当 -- **画像**: [子が実見できる画像パス/ツール、基準画像・画面条件・確認項目。不鮮明・未取得は不明。画像の品質評価や意味解釈は Luna の機械照合({{models.luna.min_effort}})に含めない] -- **原本・必須項目**: [対象ページ全体(ヘッダ/フッタ/隅)を実見し、必要時拡大。OCR/抽出の空欄を不存在にせず、見出し・値・原本位置と日付の意味を保持。「未確認」「判読不能」「見つからない」「確認範囲内で記載なし」を分ける] -- **定型取得**: [対象 ID・出典/endpoint、必須項目と型、範囲・ページング、0件・実値 `null`・未取得の区別。代表1件で抽出方法を照合してから展開するが、残りの必須項目確認は省略しない] -- **実行方法**: [利用可能なブラウザ等、承認内の代替、スクリプトの対象・保存先・実行・検証方法。未依頼の既存ブラウザプロファイル操作や不安定な複雑 quotingへ広げない] +Luna/{{models.luna.default_effort}}は明確な定型工程、Sol/{{models.sol.default_effort}}は複雑な実装・原因・重要レビュー、Astra/{{models.astra.default_effort}}は難しい前提・重大判断を担当する。model IDを明示し、再開でも観測値を推測しない。repoでは絶対cwd、repo/worktree、branch/HEAD、対象の未commit差分を示す。不一致をresetや探索で補わせない。 -同じ担当への追加指示は既存の子を優先し、変更要求・追加根拠・合格条件の差分だけ渡す。再開時の設定維持は推測せず、観測不能は不明とする。再開不能、文脈喪失、必要な設定・実行条件を満たせない、能力不足又は範囲変更の場合は未完了分だけ再配分する。無関係な仕事で文脈を膨らませない。直接の子は同時に原則1体とし、起動時は親にも独立した有用作業が必要である。伝言だけの階層や待ちだけの起動は作らない。 +## 通常Chat 6 Pro -## 完了報告 +有効なroot経路で、材料・実ツール・権限・検証環境を確認する。分析だけでなく実装・PR作成も完結可能なら候補とする。taskに具体的な対象と許可操作を明示し、handoffのrequired_information/source_requirements/freshness/allowed_tools/return_format/stop_conditionsをそろえる。allowlistはツール実在や今回の承認の証拠ではない。 -- **結論**: [合格/未達/部分達成と理由] -- **変更**: [ファイルと成果物の保存先・保存確認。変更なしは「なし」] -- **検証**: [確認方法、結果、対象 revision/diff、条件、時刻、証拠の保存先又は既存結果ID。詳細表は必要な時だけ] -- **未解決・判断依頼**: [残課題・制約・親の判断。取得不能、項目欠落、実値 `null`、0件を区別。なければ「なし」] +例:承認済みrepoの指定base SHAから作業ブランチを作り、指定範囲を修正・テストしてPRを作成する。マージ・配備はこの依頼では許可しない。返却にはPR URL、head SHA、重要差分、実行したテスト・環境・結果、未検証範囲を含める。必要な機能がなければ未完了分を返し、Work/APIへ切り替えない。 -回答だけで済む仕事に保存物や検証ログを増やさない。既存の安全な結果を再利用し、証拠のためだけにテストを再実行しない。secretや全ログは記録せず、必要な要約と参照先だけを残す。 +## 結果の受入 -## 親が観測対象とした作業だけ +結論、重要差分、合格条件との照合、検証方法・cwd・環境・終了コード・時刻・revisionと対象差分、根拠の参照、前提・反例・未解決点を必要な範囲で返す。成功/失敗/skip/未実行を区別する。HTTP成功・null・0件を不存在や完了としない。安全に残せない証拠は理由付き欠測とする。 -- [親が予約した共通task_id・sampling_keyと返却先を使い、子・孫は別の観測枠を取らない。親は最終報告前にその記録を更新する。欠測は理由付きnullで閉じ、記録完了と実測が揃った状態を区別する] -- [起動 call_id 又は結果参照、返却 task 名、直接親/root ID、親 threadId/turnId、要求設定、起動時刻を対応付ける。task名を UUID と扱わず、取得不能な ID は理由付き `null`] -- [初回起動、再開、追加指示の各 turn を分け、各 turn の call_id・親/root ID・時刻・要求 model/effort と観測 model/effort を記録する。再開後の現設定や self-report から過去の実行設定を推測しない] -- [確認できた threadId/agentId UUID、メタデータ参照、単一 turn 抽出の結果、入力/cache/出力/時間を記録する。取得できない値だけ理由付き `null`。子完了後に一度、抽出結果と記録対象の一致を照合する] -- [進行中の親 turn の最終利用量と比較基準のない節約率は `null`。cache の包含を明記し、推論分を二重計上しない。階層全体の集計は対象 turn と包含範囲を確認できる時だけ行う。孫の記録は直接親が保持し root には参照を返す] - -完了turnの差分は最初の応答より前の累積基準を使う。応答後の値しかない場合は途中区間として残し、全量として比較しない。観測のためだけに再実行せず、記録CLIと入力例はスキルの `references/observation.md` を参照する。 - -短い確認と観測対象外の作業にはこの記録を作らず、毎回全フォームを埋めない。 +親は重要な条件と証拠を確認し、同じrevision・diff・環境の有効な結果を再利用する。追加確認は変更・矛盾・失敗・証拠不足へ絞る。重大な専門判断を自己申告だけで受け入れず、同じ判断を別Astraに重複させない。必要な人の承認は維持する。 diff --git a/plugins/codex-task-routing/scripts/chat_plan.py b/plugins/codex-task-routing/scripts/chat_plan.py index 9e62520..6c34ce4 100644 --- a/plugins/codex-task-routing/scripts/chat_plan.py +++ b/plugins/codex-task-routing/scripts/chat_plan.py @@ -8,11 +8,11 @@ from pathlib import Path import sys -from chatgpt_route import ChatRouteError, _load_json_object, _require_keys +from chatgpt_route import ChatRouteError, _load_json_object, _require_keys, _require_nonempty_string FLAGS = {"substantial", "parent_has_independent_work", "materials_approved", "handoff_proportionate", "requires_repeated_local_access"} -STATES = {"advertised", "verified", "blocked"} +STATES = {"advertised", "permission_checked", "verified", "blocked"} def _keys(value, required, purpose): @@ -24,7 +24,7 @@ def _keys(value, required, purpose): def _text(value): if not isinstance(value, str) or not value.strip() or len(value) > 512: raise ChatRouteError("metadata must be a nonempty string of at most 512 characters") - return value + return _require_nonempty_string(value, purpose="metadata", maximum=512) def _time(value): @@ -41,8 +41,8 @@ def validate_inventory(value): _keys(value, {"schema_version", "surface", "model", "installed_plugins", "capabilities"}, "inventory") if type(value["schema_version"]) is not int or value["schema_version"] != 1: raise ChatRouteError("unsupported inventory schema") - if value["surface"] != "chat-temporary" or value["model"] != "6 Pro": - raise ChatRouteError("inventory must describe Temporary Chat with 6 Pro") + if value["surface"] not in ("chat-temporary", "chat") or value["model"] != "6 Pro": + raise ChatRouteError("inventory must describe normal Chat with 6 Pro") installed, caps = value["installed_plugins"], value["capabilities"] if not isinstance(installed, list) or len(installed) > 128: raise ChatRouteError("installed_plugins must be a bounded list") @@ -54,21 +54,78 @@ def validate_inventory(value): raise ChatRouteError("capabilities must be a bounded list") seen = set() for cap in caps: - _keys(cap, {"tool", "operation", "scope", "state", "observed_at", "expires_at"}, "capability") + required = {"tool", "operation", "scope", "state", "observed_at", "expires_at"} + if not isinstance(cap, dict): + raise ChatRouteError("capability must be an object") + _require_keys(cap, required=required, allowed=required | {"permission_evidence"}, purpose="capability") key = tuple(_text(cap[k]) for k in ("tool", "operation", "scope")) if key in seen: raise ChatRouteError("duplicate capability scope") seen.add(key) if cap["tool"] not in installed or not isinstance(cap["state"], str) or cap["state"] not in STATES: raise ChatRouteError("unknown tool or capability state") + # A first real operation must not require an unrelated trial write. + # This state records scoped capability/permission checks, not execution. + if cap["state"] == "permission_checked" and "permission_evidence" not in cap: + raise ChatRouteError("permission_checked requires scoped permission evidence") + if "permission_evidence" in cap: + _text(cap["permission_evidence"]) observed, expires = _time(cap["observed_at"]), _time(cap["expires_at"]) if not timedelta(0) < expires - observed <= timedelta(days=7): raise ChatRouteError("capability lifetime must be positive and at most seven days") return value -def plan(facts, inventory=None, *, now=None): - _keys(facts, FLAGS | {"needs"}, "facts") +def _delegation(facts): + """Keep legacy calls parallel; serial delegation needs an explicit host check.""" + if "delegation" not in facts: + return "parallel" + decision = facts["delegation"] + _keys(decision, {"mode", "host_allows_serial", "reason"}, "delegation") + if decision["mode"] != "serial_specialist" or type(decision["host_allows_serial"]) is not bool: + raise ChatRouteError("invalid specialist delegation") + _text(decision["reason"]) + return "serial_specialist" if decision["host_allows_serial"] else "serial_disallowed" + + +def check_live(live, *, now): + """Check supplied observations, not the account; never attest actual execution. + + A short-lived snapshot prevents a saved quota or UI observation from being + treated as a permanent permission. No remaining-message total is inferred. + """ + _keys(live, {"is_root", "route_enabled", "surface", "model", "transport", + "transport_authorized", "actions_authorized", "quota_state", "observed_at"}, "live") + for name in ("is_root", "route_enabled", "transport_authorized", "actions_authorized"): + if type(live[name]) is not bool: + raise ChatRouteError("live gates must be JSON booleans") + for name in ("surface", "model", "transport", "quota_state"): + _text(live[name]) + if live["quota_state"] not in {"unknown", "no_limit_notice", "exhausted"}: + raise ChatRouteError("invalid quota observation") + observed = _time(live["observed_at"]) + for name in ("is_root", "route_enabled", "transport_authorized", "actions_authorized"): + if not live[name]: + return {"route": "not_ready", "reason": name + "_not_established"} + expected_surface = {"browser-temporary": "chat-temporary", "codex-app-tools": "chat"}.get(live["transport"]) + if expected_surface is None or live["surface"] != expected_surface: + return {"route": "not_ready", "reason": "wrong_surface_or_transport"} + if live["model"] != "6 Pro": + return {"route": "not_ready", "reason": "required_model_not_observed"} + if live["quota_state"] == "exhausted": + return {"route": "not_ready", "reason": "quota_exhausted"} + if not timedelta(0) <= now - observed <= timedelta(minutes=2): + return {"route": "preflight_needed", "reason": "refresh_live_observations"} + if live["quota_state"] == "unknown": + return {"route": "preflight_needed", "reason": "check_model_and_limit_notice"} + return None + + +def plan(facts, inventory=None, *, now=None, live=None): + if not isinstance(facts, dict): + raise ChatRouteError("facts must be an object") + _require_keys(facts, required=FLAGS | {"needs"}, allowed=FLAGS | {"needs", "delegation"}, purpose="facts") + delegation = _delegation(facts) if any(type(facts[k]) is not bool for k in FLAGS): raise ChatRouteError("suitability flags must be JSON booleans") needs = facts["needs"] @@ -83,12 +140,24 @@ def plan(facts, inventory=None, *, now=None): # The caller supplies semantic judgments once. No classifier model is run. if not facts["materials_approved"]: return {"route": "not_ready", "reason": "materials_approval_not_established"} - for flag in ("substantial", "parent_has_independent_work", "handoff_proportionate"): + for flag in ("substantial", "handoff_proportionate"): if not facts[flag]: return {"route": "codex", "reason": flag + "_false"} + if delegation == "serial_disallowed": + return {"route": "codex", "reason": "host_does_not_allow_serial_delegation"} + if delegation == "parallel" and not facts["parent_has_independent_work"]: + return {"route": "codex", "reason": "parent_has_independent_work_false"} if facts["requires_repeated_local_access"]: return {"route": "codex", "reason": "repeated_local_access"} instant = now or datetime.now(timezone.utc) + if not isinstance(instant, datetime) or instant.tzinfo is None: + raise ChatRouteError("now requires a timezone-aware datetime") + if live is not None: + blocked = check_live(live, now=instant) + if blocked is not None: + return blocked + if inventory is not None and inventory["surface"] != live["surface"]: + return {"route": "preflight_needed", "reason": "capability_surface_mismatch"} checks = [] caps = inventory["capabilities"] if inventory else [] for need in needs: @@ -96,23 +165,29 @@ def plan(facts, inventory=None, *, now=None): state = "unknown" if cap: state = cap["state"] if _time(cap["observed_at"]) <= instant < _time(cap["expires_at"]) else "stale" - checks.append({**need, "state": state, "installed": bool(inventory and need["tool"] in inventory["installed_plugins"])}) + checks.append({**need, "state": state, "installed": bool(inventory and need["tool"] in inventory["installed_plugins"]), + "execution_verified": state == "verified"}) if any(c["state"] == "blocked" for c in checks): return {"route": "not_ready", "reason": "required_capability_blocked", "checks": checks} - if any(c["state"] != "verified" for c in checks): + if any(c["state"] not in {"verified", "permission_checked"} for c in checks): return {"route": "preflight_needed", "reason": "verify_only_required_capabilities", "checks": checks} - return {"route": "chat_candidate", "reason": "verify_live_surface_model_and_permissions", "checks": checks} + if live is None and any(c["state"] == "permission_checked" for c in checks): + return {"route": "preflight_needed", "reason": "fresh_live_required_for_unexercised_capability", "checks": checks} + return {"route": "chat_candidate", "reason": "verify_live_surface_model_and_permissions", "checks": checks, + "live_checked": live is not None, "delegation_mode": delegation} def main(argv=None): parser = argparse.ArgumentParser(description=__doc__) parser.add_argument("--facts", type=Path, required=True) parser.add_argument("--inventory", type=Path) + parser.add_argument("--live", type=Path, help="fresh, explicitly supplied dispatch observations") args = parser.parse_args(argv) try: facts = _load_json_object(args.facts, purpose="facts") inventory = _load_json_object(args.inventory, purpose="inventory") if args.inventory else None - print(json.dumps(plan(facts, inventory), ensure_ascii=False, separators=(",", ":"))) + live = _load_json_object(args.live, purpose="live") if args.live else None + print(json.dumps(plan(facts, inventory, live=live), ensure_ascii=False, separators=(",", ":"))) return 0 except (ChatRouteError, TypeError) as exc: print(json.dumps({"error": str(exc)}, ensure_ascii=False), file=sys.stderr) diff --git a/plugins/codex-task-routing/scripts/chatgpt_route.py b/plugins/codex-task-routing/scripts/chatgpt_route.py index 7b88910..6d65f3a 100644 --- a/plugins/codex-task-routing/scripts/chatgpt_route.py +++ b/plugins/codex-task-routing/scripts/chatgpt_route.py @@ -404,8 +404,8 @@ def _build_prompt_v2(request: Mapping[str, Any], input_sha256: str) -> str: ) -def _build_prompt(request: Mapping[str, Any], input_sha256: str) -> str: - """Render the current Temporary Chat prompt with an optional handoff contract.""" +def _build_prompt_v3(request: Mapping[str, Any], input_sha256: str) -> str: + """Render the 0.6/0.7 prompt unchanged for strict in-flight validation.""" request_json = json.dumps(request, ensure_ascii=False, sort_keys=True, separators=(",", ":")) return "\n".join( @@ -431,16 +431,39 @@ def _build_prompt(request: Mapping[str, Any], input_sha256: str) -> str: ) +def _build_prompt(request: Mapping[str, Any], input_sha256: str) -> str: + """Use verified capabilities, not a writing-only task label, for new work.""" + prompt = _build_prompt_v3(request, input_sha256) + prompt = prompt.replace( + "This route is for research, comparison, drafting, and review.", + "This route can handle research, analysis, design, drafting, review, and explicitly authorized implementation, testing or pull requests when the actual tools and verification environment suffice.", + 1, + ) + return prompt.replace( + "This is the actual task request; do not send a separate availability handshake.", + "This is the actual task request; do not send a separate availability handshake. For implementation, verify the specified repository, base/head revision, allowed files and operations, and test environment. Do not infer merge or deployment approval from permission to create a pull request. Return changed revisions, test results and unverified environments; stop if the required capability or approval is missing.", + 1, + ) + + def prepare_payload(value: Mapping[str, Any]) -> dict[str, str]: """Create the portable bundle printed by ``prepare`` from inline text.""" request = _normalise_request(value, require_request_id=False) input_sha256 = _sha256(request) - return { + bundle = { "request_id": request["request_id"], "input_sha256": input_sha256, "prompt": _build_prompt(request, input_sha256), } + # The prompt contains JSON inside a JSON string. Quotes, backslashes and + # non-ASCII text make source character counts an unsafe size estimate. + # Match the CLI's serialization, including its final newline, so every + # successful prepare result can be read by validate and the local helper. + encoded = (json.dumps(bundle, ensure_ascii=False, sort_keys=True) + "\n").encode("utf-8") + if len(encoded) > MAX_JSON_BYTES: + raise ChatRouteError("prepared bundle exceeds the size limit; shorten materials or use scoped source references") + return bundle def _expected_request(value: Mapping[str, Any]) -> tuple[str, str]: @@ -467,7 +490,7 @@ def _expected_request(value: Mapping[str, Any]) -> tuple[str, str]: raise ChatRouteError("prepared bundle request_id does not match its prompt") if input_sha256 != expected_hash: raise ChatRouteError("prepared bundle input_sha256 does not match its prompt") - canonical_prompts = {_build_prompt(prompt_request, expected_hash)} + canonical_prompts = {_build_prompt(prompt_request, expected_hash), _build_prompt_v3(prompt_request, expected_hash)} if "handoff" not in prompt_request: canonical_prompts.update( { diff --git a/plugins/codex-task-routing/scripts/routing.py b/plugins/codex-task-routing/scripts/routing.py index 08f86c6..2488584 100644 --- a/plugins/codex-task-routing/scripts/routing.py +++ b/plugins/codex-task-routing/scripts/routing.py @@ -1351,15 +1351,15 @@ def _chatgpt_context(home: Path, plugin_root: Path) -> str: return ( f"\nOpt-in ChatGPT Chat route is enabled (required UI model: 6 Pro; transport: {transport}{legacy_suffix}). " "This is a user-enabled alternative to standard Codex children for substantial, independent " - "research, comparison, drafting and review tasks. Before assigning a substantial independent work unit, " + "research, analysis, design, drafting, review and explicitly authorized implementation/testing/PR tasks. Before assigning a substantial work unit, " "evaluate this Chat route first: prefer 6 Pro when approved materials and verified tools suffice and " "handoff, waiting, acceptance and rework costs are proportionate. Do not require another plugin mention. " - "Split analysis/design from local execution when useful; keep short or repeatedly local work in Codex. " - "The parent must still have useful independent work. Check required information, sources/freshness, " + "Use Chat as the initial main specialist, not a redundant final review. Include implementation/PR work only with actual tools, scoped write approval and a sufficient test environment. Keep short work or repeated access to Codex-only local resources in Codex. " + "Parallel delegation requires useful independent parent work. Serial specialist delegation requires explicit host permission and concrete added value; never invent parent work or bypass host rules. Check required information, sources/freshness, " "allowed tool capabilities, return format and stop conditions before dispatch. " "Read the route instructions before use: " f"{reference}. " - "Use normal Chat only; never Work or a model API. Verify the Chat surface and 6 Pro in the UI " + "Before dispatch use chat_plan.py --live with fresh observations; supplied flags are not proof of permission. Confirm the permitted transport separately from quota and opt-in; unknown authorization blocks dispatch. Use normal Chat only; never Work or a model API. Verify the Chat surface and 6 Pro in the UI " "before dispatch and verify the model after completion; tool replies do not attest a backend model. " + transport_note + "Use an isolated conversation per task, request IDs and input hashes. Missing tools, unknown model " @@ -1445,13 +1445,13 @@ def hook_payload( model_matrix = "; ".join( f"{role.title()}={policy.config['models'][role]['id']} " f"({policy.config['models'][role]['default_effort']})" - for role in REQUIRED_MODEL_ROLES + for role in ("luna", "sol", "astra") ) context = "\n".join( [ f"Codex Task Routing manifest {policy.version}; policy hash {policy.content_hash}.", f"Configured child-routing reference only; it does not change the parent: {model_matrix}.", - "Follow the parent-specified scope and acceptance criteria; re-delegate only under the detailed policy, and distinguish unverified work from confirmed results.", + "Terra child is outside the standard route. Follow the parent-specified scope and acceptance criteria; return specialist questions to the parent rather than re-delegating, and distinguish unverified work from confirmed results.", f"Effective policy: {references['effective.md']}", "Detailed policy references:", detail_refs, diff --git a/plugins/codex-task-routing/skills/task-routing/SKILL.md b/plugins/codex-task-routing/skills/task-routing/SKILL.md index 377128b..983e620 100644 --- a/plugins/codex-task-routing/skills/task-routing/SKILL.md +++ b/plugins/codex-task-routing/skills/task-routing/SKILL.md @@ -7,15 +7,15 @@ description: Apply Codex Task Routing for substantial independent tasks, includi Avoid a classifier-only model call or repeated full tool inventories. For a substantial Chat candidate, reuse the scoped, expiring capability inventory and deterministic `chat_plan.py` checks in [capability reuse](references/chat-capabilities.md); short work needs no extra planning files. Use [local transfer](references/chat-transfer.md) when supported Browser DOM operations can move the prepared prompt and final response without echoing their full text into the parent's context. These helpers do not authorize dispatch, attest a model, or replace semantic acceptance. -For an enabled normal Chat route, evaluate Chat suitability before choosing a native child for each substantial independent work unit; users need not mention this plugin again. Prefer 6 Pro for work that can finish with approved materials and verified tools when preparation, waiting, acceptance and rework are proportionate. Split analysis or design from local execution when useful. Preserve the parent's useful independent work requirement. A small remainder or repeated local inspection stays in Codex. Use the route reference's selection and handoff checks; enabling Chat does not grant data sharing or tool permissions. +For an enabled normal Chat route, evaluate Chat suitability before choosing a native child for each substantial independent work unit; users need not mention this plugin again. Prefer 6 Pro for work that can finish with approved materials and verified tools when preparation, waiting, acceptance and rework are proportionate. Use 6 Pro as the initial main specialist, including implementation, testing and PR creation when the actual tools, scoped write approvals and verification environment suffice. Split analysis from Codex-only execution when useful. Small work or repeated inspection of Codex-only resources stays in Codex. Use the route reference's selection and handoff checks; enabling Chat does not grant data sharing or tool permissions. -Use the effective policy already supplied by this plugin's start hook. Keep the user's chosen parent model and effort. It authorizes choosing suitable standard subagents only within the user's task, available tools, and higher-priority instructions. A child requires a bounded independent task and useful independent work for its direct parent. Short work stays with the current capable agent. +Use the effective policy already supplied by this plugin's start hook. Keep the user's chosen parent model and effort. It authorizes choosing suitable standard subagents only within the user's task, available tools, and higher-priority instructions. The reference parent is Terra/xhigh and does normal work itself. Do not normally create a Terra child. Automatic child effort uses the effective default_effort: Luna/max, Sol/high, Astra/high in bundled defaults; preserve explicit overrides. Parallel delegation needs useful independent parent work. Serial specialist delegation requires concrete added value and explicit host permission; do not invent parent work or bypass higher-priority restrictions. Short work stays with the current capable agent. -When the hook explicitly reports the opt-in ChatGPT Chat route enabled, the root parent may use [normal Chat routing](references/chatgpt.md) as the user-enabled exception for substantial independent research, comparisons, drafts and reviews. Read that reference before dispatch. Use normal Chat with the required UI model `6 Pro`, never Work or a model API, and match request IDs and input hashes. The default `browser-temporary` transport uses supported Browser operations to create one Temporary Chat, send the real request once, and read the final answer; never call `send_message_to_thread` for that Temporary Chat. `codex-app-tools` remains a legacy transport only when an existing setting explicitly selects it. The helper prepares and validates local data only. Missing capability or unknown model blocks this route. Do not route from subagents. If the opt-in is absent or invalid, retain the standard Codex child policy. +When the hook explicitly reports the opt-in ChatGPT Chat route enabled, the root parent may use [normal Chat routing](references/chatgpt.md) as the user-enabled exception for substantial work supported by the actual Chat capabilities and approvals, including research, design, review, implementation and PR creation. Read that reference and [usage/authorization gates](references/chat-limits.md) before dispatch. Run chat_plan.py with fresh --live observations; candidate classification never authorizes a dispatch. Contract price, enabled settings or installed tools do not establish permission for automatic extraction. Missing transport authorization blocks dispatch. Use normal Chat with the required UI model `6 Pro`, never Work or a model API, and match request IDs and input hashes. The default `browser-temporary` transport uses supported Browser operations to create one Temporary Chat, send the real request once, and read the final answer; never call `send_message_to_thread` for that Temporary Chat. `codex-app-tools` remains a legacy transport only when an existing setting explicitly selects it. The helper prepares and validates local data only. Missing capability or unknown model blocks this route. Do not route from subagents. If the opt-in is absent or invalid, retain the standard Codex child policy. If no effective policy was supplied, run `python /scripts/routing.py status --json`, where plugin-root is two directories above this skill folder. Inspect conflicts and errors before calling the policy active. Do not silently replace existing global or project instructions. Read only the relevant section of the resolved policy and catalog; use the handoff reference when needed. Loading this skill alone does not install or trust its hooks. -For a handoff, specify the model and effort explicitly, purpose, scope, approved actions, completion criteria, evidence, return conditions, and the independent work retained by the parent. Reuse a suitable existing child for follow-up, with only the change and new evidence. Recheck model and effort availability from the current host; config values are requests, not proof of execution. Return important judgment and acceptance to the parent. Do not recommend a model for the user's next message. +For a handoff, specify the model and effort explicitly, purpose, scope, approved actions, completion criteria, evidence, return conditions, and either the independent parent work for parallel delegation or the added value and host permission for serial specialist delegation. Reuse a suitable existing child for follow-up, with only the change and new evidence. Recheck model and effort availability from the current host; config values are requests, not proof of execution. Return important evidence, assumptions, counterexamples and unresolved judgments to the parent. Reuse valid specialist work rather than redo it; parent coordination does not replace required specialist or human approval. PR creation permission is not merge/deployment permission. Do not recommend a model for the user's next message. For substantial normal work, use the observation allowance supplied by the start hook. While a slot remains, record the start with a stable root-task/work-unit ID and follow [observation](references/observation.md) to close that same record before the final answer. Keep the returned sampling_key with the ID across resumptions and child results; close the original sample even if policy changes. Three work units per effective policy content are enough; audits, setup, and short questions do not consume slots. Record unavailable usage with a reason rather than leaving the work unrecorded. A closed record does not imply complete usage coverage. The recorder accepts supplied metadata; it does not collect conversation logs or prove model execution. Do not launch agents, repeat checks, or scan history just to fill fields. diff --git a/plugins/codex-task-routing/skills/task-routing/references/chat-capabilities.md b/plugins/codex-task-routing/skills/task-routing/references/chat-capabilities.md index f5e74b8..a9b0d60 100644 --- a/plugins/codex-task-routing/skills/task-routing/references/chat-capabilities.md +++ b/plugins/codex-task-routing/skills/task-routing/references/chat-capabilities.md @@ -4,15 +4,15 @@ ## 接続一覧を毎回読まない -同じ工程は同じfactsファイルと一行の選定理由を再利用し、材料・範囲・必要操作・親の独立作業・準備や検収の負担が変わった時だけ意味判断をやり直します。期限の照合はCLIで再実行でき、分類のためにモデルへ材料を再送しません。新しいChatのUI・6 Pro・必要プラグインの提供状態は現在の画面で確認します。 +同じ工程は同じfactsファイルと一行の選定理由を再利用し、材料・範囲・必要操作・委譲方式・ホストの制約・準備や検収の負担が変わった時だけ意味判断をやり直します。期限の照合はCLIで再実行でき、分類のためにモデルへ材料を再送しません。新しいChatのUI・6 Pro・必要プラグインの提供状態は現在の画面で確認します。 初回は依頼に必要な接続だけ、利用者が一覧調査を依頼した時は既存接続のメタデータだけを確認します。サポートされたChatの設定・一時Chatのプラスメニューで確認し、Codex側のツール一覧からChatの能力を推測しません。接続の確認だけを目的にメール本文や顧客データを取得しません。 結果は利用者が指定したローカル領域、通常は `/codex-task-routing/capabilities.json` に保存します。配布キャッシュや公開repoには個人の接続一覧を入れません。秘密、アカウント識別子、会話URL、応答全文、認証情報は保存しません。フックは一覧を読み込まず、会話コンテキストにも注入しません。 - `installed_plugins` はインストール済みの名前です。接続・権限・Chatでの取得成功を保証しません。 -- `capabilities` は実際に必要となった操作と対象範囲だけ記録します。`advertised` はそのChat側で操作の提供を確認、`verified` は同じ操作と対象範囲で実取得を確認、`blocked` は取得不能です。設定の「すべて許可」は新しい仕事の承認ではありません。 -- `scope` は完全一致です。例のrepoでの成功を全repo、書込み、CI実行へ拡張しません。UIだけで見た操作はverifiedにしません。Chatの自己申告だけで更新せず、ツール実行の表示、出典、取得範囲を確認します。 +- `capabilities` は実際に必要となった操作と対象範囲だけ記録します。`advertised` はそのChat側で操作の提供だけを確認、`permission_checked` は操作仕様と対象範囲の権限を確認したが未実行、`verified` は同じ操作と対象範囲で実行成功を確認、`blocked` は利用不能です。設定の「すべて許可」は新しい仕事の承認ではありません。 +- `scope` は完全一致です。例のrepoでの成功を全repo、書込み、CI実行へ拡張しません。UIだけで見た操作はverifiedにしません。初回操作は下記のpermission_checkedを使い、事前の試験書込みを要求しません。Chatの自己申告だけで更新せず、ツール実行の表示、出典、取得範囲を確認します。 - 各記録に確認日時と有効期限を付けます。最大7日で、短い期限を選べます。未来日時・期限切れはstaleとして必要分だけ再確認します。接続エラー、再ログイン、権限やアカウント変更に気づいたら期限内でも直ちにblockedまたはadvertisedへ戻します。 - 検索は `needs` に合う操作だけ。未登録・期限切れは不存在と断定せず、必要な接続だけ確認します。本文が十分ならツールなしの依頼にできます。 @@ -63,10 +63,64 @@ python /scripts/chat_plan.py --facts facts.json --inventory /scripts/chatgpt_route.py prepare --input request.json` で依頼を1回だけ準備します。出力された `prompt` を初回の実依頼として送ります。接続確認だけのハンドシェイクは送りません。 -5. `prompt` が複数行なら、`typeText` で打ち込まず、サポートされた `paste({format:'text'})` または対応した `fill` で入力します。送信前に入力欄の本文が `prompt` と一致し、既存の文面が混ざっていないことを確認してから、送信ボタンを1回だけ使います。選択したプラグインのチップが入力欄に含まれるUIでは、観測済みのチップだけを本文とは別に確認し、本文を任意に削除・trimして照合しません。確認できない場合は送信しません。 -6. サポートされたBrowser操作で同じ一時Chatの最終回答を取得します。`send_message_to_thread` と `read_thread` は一時Chatに使いません。前者は内部で `isTemporaryChat: false` を固定するためです。30秒程度から間隔を広げて完了を待ち、経過を利用者へ伝えます。10分で回答がなければ未完了とし、必要ならサポートされたhandoff機能でタブを保持します。回答待ちや取得失敗で同じ依頼を再送したり、処理中のタブを勝手に閉じたりしません。 +5. 現在のUIと承認を確認した新しいlive.jsonを使い、`chat_plan.py --facts facts.json --inventory capabilities.json --live live.json`を実行します。ツール不要ならinventoryを省略できます。`chat_candidate`かつ`live_checked:true`でも入力された観測の照合であり、実行許可を生成するものではありません。不足があれば送信しません。`prompt` が複数行なら、`typeText` で打ち込まず、サポートされた `paste({format:'text'})` または対応した `fill` で入力します。送信前に入力欄の本文が `prompt` と一致し、既存の文面が混ざっていないことを確認してから、送信ボタンを1回だけ使います。選択したプラグインのチップが入力欄に含まれるUIでは、観測済みのチップだけを本文とは別に確認し、本文を任意に削除・trimして照合しません。確認できない場合は送信しません。 +6. サポートされたBrowser操作で同じ一時Chatの最終回答を取得します。`send_message_to_thread` と `read_thread` は一時Chatに使いません。前者は内部で `isTemporaryChat: false` を固定するためです。30秒程度から間隔を広げて完了を待ち、経過を利用者へ伝えます。10分は進捗を確認する目安で、中止・失敗判定の期限ではありません。まだ処理中なら未完了の状態を伝え、実行環境と依頼の時間制約内で待機またはサポートされたhandoff機能でタブを保持します。回答待ちや取得失敗で同じ依頼を再送したり、処理中のタブを勝手に閉じたりしません。 7. 最終回答だけを明示したローカル作業場所へ `reply.json` として保存し、`python /scripts/chatgpt_route.py validate --request bundle.json --response reply.json` で `request_id` と `input_sha256` を照合します。`blocked` と `missing_input` は成功ではありません。親は合格条件、出典と対象範囲、重要な反例を確認し、有効な根拠を再利用して必要な成果物だけを保存します。同じ分析を全面的にやり直す検収を常態化させません。 -8. UIの `6 Pro` 表示を回答取得後にも確認します。モデル表示が変わった場合は受入を止め、別モデルの結果として扱います。バックエンドのモデルIDは不明のままにし、自己申告で補完しません。 +8. UIの `6 Pro` 表示を回答取得後にも確認します。モデル表示が不明・変化した場合や上限通知が出た場合は受入を止め、モデル未確認の結果として扱います。別モデルを観測した時だけその事実を記録します。バックエンドのモデルIDは不明のままにし、自己申告で補完しません。 9. 修正が必要なら、閉じる前の同じ一時Chatで、新しい依頼IDと材料hashを使って修正を依頼できます。結果の受入と保存が完了したら、一時Chatを保存せず閉じます。会話URL、会話ID、認証情報、入力全文、実会話ログを公開repoに保存しません。閉じた後に追加作業が必要なら、必要最小限の材料を新しい一時Chatへ渡し、新しい `request_id` で依頼します。 具体的な修正を渡しても同じ問題が続く時、根拠が取得できない時、範囲拡大・新しい承認・現物作業が必要になった時は親へ戻します。新情報のない再送や、権限・接続不足をモデル変更で解決する試行はしません。通常3件までの既存観測枠で、取得できるCodex利用量、準備・検収・手戻りと品質を扱います。節約率は比較基準と測定範囲がそろう場合だけ示し、Chat回数や全会話収集を新たな目標にしません。 @@ -61,7 +63,7 @@ MCPが必要な仕事では、この依頼に必要な対応だけを整理し `` は導入済みコピーのルートです。設定の診断は `python /scripts/chatgpt_route.py status` で行います。正常な `enabled: true` は設定の検証結果であり、Browser機能、実行モデル、利用枠の証明ではありません。 -依頼JSONは `task`(仕事と許可範囲)、`materials`(本文)、`acceptance_criteria`(非空の文字列配列)を持ちます。`request_id` は任意のUUIDで、省略時に生成します。AIは0.6.0の新規依頼に上の `handoff` 6項目を添えます。CLIでは後方互換のため新規prepareでもhandoffを省略できますが、未指定情報を推測して補いません。機密データを公開repoへ保存しないよう、ローカルの明示した作業用ディレクトリを使います。 +依頼JSONは `task`(仕事と許可範囲)、`materials`(本文)、`acceptance_criteria`(非空の文字列配列)を持ちます。`request_id` は任意のUUIDで、省略時に生成します。AIは新規依頼に上の `handoff` 6項目を添えます。CLIでは後方互換のため新規prepareでもhandoffを省略できますが、未指定情報を推測して補いません。機密データを公開repoへ保存しないよう、ローカルの明示した作業用ディレクトリを使います。 ```json { @@ -84,7 +86,7 @@ python /scripts/chatgpt_route.py prepare --input request.json python /scripts/chatgpt_route.py validate --request bundle.json --response reply.json ``` -`prepare` のJSON出力をUTF-8の `bundle.json` として保持し、送信するのはそのオブジェクトの `prompt` 文字列です。返信は当該依頼の最終回答だけをUTF-8の `reply.json` に保存します。Markdownの囲いが付いた場合は単一のJSON部分だけを取り出せますが、IDや内容を修正して照合を通してはいけません。`validate` は現行形式と0.4・0.5系で生成済みの形式を厳密に照合し、更新中の依頼回収を維持します。handoffの変更も材料hashに反映されます。`validate` の終了コード0は形式と対応関係の成功であり、品質、モデル、利用枠、外部ツールの実行を保証しません。 +`prepare` のJSON出力をUTF-8の `bundle.json` として保持し、送信するのはそのオブジェクトの `prompt` 文字列です。返信は当該依頼の最終回答だけをUTF-8の `reply.json` に保存します。Markdownの囲いが付いた場合は単一のJSON部分だけを取り出せますが、IDや内容を修正して照合を通してはいけません。`validate` は現行形式と0.4〜0.7系で生成済みの形式を厳密に照合し、更新中の依頼回収を維持します。handoffの変更も材料hashに反映されます。`validate` の終了コード0は形式と対応関係の成功であり、品質、モデル、利用枠、外部ツールの実行を保証しません。 ## 既存 `codex-app-tools` 設定 diff --git a/plugins/codex-task-routing/skills/task-routing/references/configuration.md b/plugins/codex-task-routing/skills/task-routing/references/configuration.md index af68b4f..c9864e3 100644 --- a/plugins/codex-task-routing/skills/task-routing/references/configuration.md +++ b/plugins/codex-task-routing/skills/task-routing/references/configuration.md @@ -10,7 +10,7 @@ python plugins/codex-task-routing/scripts/routing.py --config examples/overrides 上書きに含めたフィールドだけを変更します。`schema_version` は1。役割キーは `luna`、`terra`、`sol`、`astra`。各役割は `id`、`min_effort`、`default_effort`、`max_effort` を持ちます。別のモデルを設定しても役割ラベルは変えません。 -effortの設定値は `medium`、`high`、`xhigh`、`max` で、下限≤標準≤上限が必要です。これはこの版の子の選定設定であり、親のeffortには適用しません。値が妥当でも、実際のモデルがそのeffortを受け付けるかは実行時の機能で確認します。 +effortの設定値は `medium`、`high`、`xhigh`、`max` で、下限≤標準≤上限が必要です。自動選定には有効なdefault_effortだけを固定値として使います。min_effort/max_effortは互換性とoverrideの範囲検証用で、毎回の候補ではありません。Terra定義は互換性維持のため残し、Terra子を標準にしません。親の実設定には適用しません。値が妥当でも、実際のモデルがそのeffortを受け付けるかは実行時の機能で確認します。 未定義キー、重複したJSONキー、型違い、空文字、無効範囲、解決できないテンプレートはエラーとして扱います。設定内容の誤りを既定値への暗黙の切戻しで隠しません。 diff --git a/plugins/codex-task-routing/skills/task-routing/references/observation.md b/plugins/codex-task-routing/skills/task-routing/references/observation.md index e1156f9..b55595e 100644 --- a/plugins/codex-task-routing/skills/task-routing/references/observation.md +++ b/plugins/codex-task-routing/skills/task-routing/references/observation.md @@ -67,3 +67,7 @@ python observation status --json ``` 現在の方針の残枠・進行中・記録完了・使用量の欠測を区別します。過去の群を読む場合は保存した `--sampling-key` を指定します。3件の枠を使い切った後は新規記録を増やしません。破損や権限不足は不明として残し、空の台帳で上書きしません。観測の問題だけを理由に本来の仕事を止めないでください。 + +## 0.8.0の比較 + +子のeffortは固定したまま、親変更とChat適合工程の移動を分けて比較します。モデル別の割合ではなく親子合計の使用量と同じ合格条件までの手戻りを見ます。Chatのメッセージ・人の修正・初回受入はCodexトークンと混ぜず、必要な短い比較記録を別途使います。既存台帳のキーや残枠を変更せず、比較のためだけに追加仕事を起動しません。 diff --git a/scripts/check_package.py b/scripts/check_package.py index fd6200b..93d7c77 100644 --- a/scripts/check_package.py +++ b/scripts/check_package.py @@ -17,7 +17,7 @@ def check(): assert not {'hooks', 'mcpServers', 'apps'} & manifest.keys() assert re.fullmatch(r'\d+\.\d+\.\d+(?:[+-][\w.-]+)?', manifest['version']) assert manifest['author']['name'] == 'Acecore' - for name in ['LICENSE', 'scripts/routing.py', 'scripts/chatgpt_route.py', 'scripts/updater.py', 'scripts/updater_entry.py', 'scripts/install_updater.py', 'hooks/hooks.json', 'defaults/config.json', 'skills/task-routing/SKILL.md', 'skills/task-routing/references/configuration.md', 'skills/task-routing/references/chatgpt.md', 'skills/task-routing/references/observation.md', 'skills/task-routing/references/observation-example.json']: + for name in ['LICENSE', 'scripts/routing.py', 'scripts/chatgpt_route.py', 'scripts/updater.py', 'scripts/updater_entry.py', 'scripts/install_updater.py', 'hooks/hooks.json', 'defaults/config.json', 'skills/task-routing/SKILL.md', 'skills/task-routing/references/configuration.md', 'skills/task-routing/references/chatgpt.md', 'skills/task-routing/references/observation.md', 'skills/task-routing/references/chat-limits.md', 'skills/task-routing/references/observation-example.json']: assert (PLUGIN / name).is_file(), name hooks = json.loads((PLUGIN / 'hooks/hooks.json').read_text(encoding='utf-8'))['hooks'] for name in ['scripts/chat_plan.py', 'scripts/chat_transfer.py', 'skills/task-routing/references/chat-capabilities.md', 'skills/task-routing/references/chat-transfer.md']: @@ -30,10 +30,11 @@ def check(): assert hook['command'] == "python -c \"import os,runpy;runpy.run_path(os.path.join(os.environ['PLUGIN_ROOT'],'scripts','routing.py'),run_name='__main__')\" hook" assert hook['timeout'] <= 10 config = json.loads((PLUGIN / 'defaults/config.json').read_text(encoding='utf-8')) - assert config['policy_revision'] == '2026-09-14-observation-completion' + assert config['policy_revision'] == '2026-09-15-terra-chat-fixed' assert config['models']['luna']['default_effort'] == 'max' assert config['models']['terra']['default_effort'] == 'xhigh' assert config['models']['sol']['default_effort'] == 'high' + assert config['models']['astra']['default_effort'] == 'high' forbidden = re.compile(r'(?:[A-Za-z]:[/\\]Users[/\\](?!<|\$)[A-Za-z0-9_-]+)|(?:-----BEGIN (?:RSA |EC |OPENSSH )?PRIVATE KEY-----)|(?:gh[pousr]_[A-Za-z0-9]{30,})') for path in PLUGIN.rglob('*'): if not path.is_file() or '__pycache__' in path.parts: diff --git a/tests/fixtures/model-routing-catalog.md b/tests/fixtures/model-routing-catalog.md index 4af82a9..b11fa2b 100644 --- a/tests/fixtures/model-routing-catalog.md +++ b/tests/fixtures/model-routing-catalog.md @@ -1,113 +1,42 @@ -# 具体的な仕事の分類表(2026-09-14・節約優先) +# 作業分類表 — 固定effortと通常Chat優先 -## 通常Chatが有効な場合の優先判定 +この表は担当候補であり、親の設定変更・送信・外部書込みの許可ではない。短い通常作業は親で終える。基準運用は親Terra/xhigh、子はLuna/max・Sol/high・Astra/high。Terra子は標準ルート外。既存overrideの有効な固定値を使う。 -開始時フックが通常Chat経路を有効と示した場合だけ、rootは下表の通常子を選ぶ前にChatへの適合を検討する。承認済みの材料とChat側で確認したツールで完結する、まとまった比較・分析・反証・設計・文案・レビューは6 Proを優先候補とする。毎回のプラグイン指定は不要。難しい判断だけを理由にSolやAstraへ固定しない。 +## 選定の順序 -開発・運用という仕事名で全体をCodexへ固定せず、Codexで証拠取得→Chatで分析・設計→Codexで実装・検証のように必要な工程を分ける。準備・待ち時間・受入・手戻りが見合わない短い仕事、頻繁な現物照会は現在の担当で進める。親にも実際の独立作業が必要であり、待つだけの委譲はしない。 +まとまった工程では、Chat経路が有効であれば6 Proを最初の主担当候補にする。難問だけに限定せず、必要情報・実ツール・対象権限・検証環境でその工程を完結できるかを見る。短い残作業、Codex側の現物への頻繁な照会、機密を渡せない場合、準備・検収が過大な場合はCodexに残し、理由を一言残す。上位モデルから下位へ、または下位から上位へ順番に試す必要はない。 -Chatの有効化だけで非公開資料の送信や接続の権限が増えることはない。必要情報・出典と鮮度・許可ツール・返却形式・停止条件をそろえ、開始時フックが示すChat手順で能力確認と送受信を行う。Chat経路が無効、未確認又は不適合なら理由を短く残し、下表の既存model/effort選定を使う。子からChatへ再委譲しない。 +並列分担は親にも有用な独立作業が必要。直列の専門委譲は具体的な追加価値とホストの許可を確認する。許可不明・禁止なら起動せず、不要な親の仕事や別CLIで条件を迂回しない。 -繰り返す担当選びを減らすための第一候補。品質を保ちながら時間短縮より総トークン数・利用負担の削減を優先し、引継ぎ・確認・手戻りを含めて選ぶ。性能・価格・節約率を実証した表ではなく、同じディレクトリの `model-routing-policy.md` に従う運用上の既定値である。見出しを検索して該当分野の一節だけ読む(目安20〜40行)。有効な既読条件は再利用する。下表は新規割当て・能力や範囲が変わった時の候補であり、工程ごとに担当を切り替える指示ではない。同じ仕事の続きや短い検証は能力の足りる既存担当を優先し、短い残作業だけのために新規起動しない。Lunaのために親が解法を作り込む必要がある通常工程はTerra、複雑な矛盾解消を含む工程はSolを検討する。安い順の試行や子の利用件数を目標にしない。 +## 調査・文書・事務 -| モデル | 下限 | 標準 | 上限 | 選択の要点 | -| --- | --- | --- | --- | --- | -| Luna | xhigh | max | max | xhighは全固定条件を満たす機械照合だけ。指定資料抽出、既知パターン探索、一意の局所修正、取り違え防止はmax。 | -| Terra | high | xhigh | max | highは原因・方針が確定した小変更や限定比較、xhighは通常の調査・実装・検証、maxは前提確定後に多数の境界条件・組合せを深く詰める工程。 | -| Sol | medium | high | xhigh | mediumは論点・対象・受入条件が明確な限定調査・レビュー、highは複数モジュール整合や難しい原因・互換性・重要レビュー、xhighは設計前提の再検討や複雑因果・反証。 | +| 作業条件 | 候補と合格条件 | +| --- | --- | +| 指定原文の項目取得、抽出、固定列の照合 | 親、またはまとまった工程はLuna。対象・必要項目・ページング・0件と未取得の区別を固定 | +| 公開情報・承認済み接続先の調査・比較 | 実取得ツールが使える6 Proを優先。出典・対象版・日付・確認範囲・未取得を返す | +| 要件整理、分析、設計、矛盾・反例の検討 | 6 Proを主担当候補。利用不能なら通常は親、複雑な整合はSol、難しい前提はAstra | +| 文案・翻訳・報告書・資料レビュー | まとまった工程は6 Pro。短い整形は親。高影響の表現は根拠と承認を確認 | +| 帳票の網羅確認、日付や欠測の解釈 | 原本を実見できる親Terraまたは6 Pro。OCR空欄だけで記載なしとしない | +| 認証・課金・税務・個人情報に関する判断 | 事実取得と重要判断を分離。適任の専門判断・最新の公式根拠・必要な人の承認を省略しない | -- Lunaの原則はmaxで、xhighが下限である。xhighは **固定手順・固定入力・固定期待値・機械的な正誤照合・解釈不要・低影響** をすべて満たす時だけ選ぶ。指定資料の抽出、既知パターンの探索、一意で低影響な局所修正、対応関係の取り違え防止はmaxを選ぶ。意味の解釈、画像の実見や目視評価は機械照合に含めない。未知環境への構築・復元や原因推定が必要なら着手前に親へ戻し、Lunaの担当範囲をeffortで補わない。Lunaは有効な下限未満・上限超を使わない。件数・長時間実行・複数手順だけでは上げない。 -- Terraの原則はxhighで、下限はhigh、上限はmaxである。原因と方針が確定した小変更、既定条件での限定比較、未知依存や例外が少ない仕事はhighにする。通常の調査・実装・検証、原本の全件確認、日付の意味の区別、曖昧な分類、欠測の解釈はxhighにする。設計と担当範囲が確定し、多数の境界条件や組合せを深く詰める必要がある時だけmaxにする。Terraは有効な下限未満・上限超を使わない。作業量だけでは上げない。 -- Solの原則はhighで、下限はmedium、上限はxhighである。Solの理解力を要するが、論点・対象・受入条件が明確で広い探索を要しない限定調査・レビューはmediumにする。複数モジュールの整合、難しい不具合、互換性、矛盾した証拠、重要レビューはhighにする。設計前提の再検討、複雑な因果、難しい反証や競合条件はxhighにする。Solは有効な下限未満・上限超を自動選定しない。モデルの能力境界をeffortで越えず、Astra親が初期方針、設計変更・重大判断、最後の重要根拠と受入確認を担う。 -- low・none・minimal・Ultraは自動選定しない。ユーザーが選んだ親のmodel・effortは維持する。再開時は要求と実際に観測したmodel・effortを分け、設定が未知なら確認済みとしない。必要な設定・実行条件を満たせない場合は正本に従って未完了分だけ再配分し、観測の欠測だけで新規起動を増やさない。 -- 直接の子は同時に原則1体。階層を明示した時はTerra1体とそのLuna1体までを目安とする。親にも独立して進める有用な仕事がある時だけ子を起動し、並列化自体を目的にしない。純粋な伝言係を置かず、待つだけの委譲のために仕事を捏造しない。 -- 階層委譲は既定で一段。範囲のまとまった工程は、下表の作業条件に合うeffortのTerraに実装と進行を含めて任せられる。親が明示した工程内だけ、TerraからLunaへ1段追加できる(root Astra→Terra→Luna、最大2辺)。追加子にも独立した作業・入力・合格条件と、その直接の親にも独立した有用な仕事が必要で、孫の再委譲は禁止する。機能・上位指示が許さない場合は既存の担当へ戻し、正本の階層条件に従う。 -- 表の担当は実作業の候補であり、承認・公開・本番操作の範囲を広げない。子にはmodel・effortと選定理由、対象、根拠、合格条件、検証環境、承認範囲、再委譲可否、親へ戻す条件を明示する。上限を超える難しさは安い順に試さず親へ戻す。手戻りを含む総負担を測定していないため、同等性能や節約率は保証しない。 +## 実装・運用・PR -各行の「確認方法・完了条件」は、指定範囲の確認・依頼された保存・必要な検証・結果報告までを指す。「保存」は依頼された成果物や必要な証拠が対象で、回答だけで済む仕事に新規ファイルを作らない。既存の再参照できる結果も使い、観点ごとに別ログを増やさない。秘密値や不要な原本全文をログへ残さず、依頼された処理と必要な証拠に範囲を絞る。未掲載の仕事は正本の近い条件で判断する。矛盾・影響拡大・繰り返す失敗・検証不能は親へ返し、権限やログイン不足をモデル変更で解決しない。画像の実閲覧、必須スキル・ツール、既存の承認範囲を守る。 +| 作業条件 | 候補と合格条件 | +| --- | --- | +| 一意の局所修正、通常の実装・検証 | 親Terraで完結。少量の仕事を別のTerraへ渡さない | +| 既知手順のまとまった取得・処理・テスト実行 | Luna。異常原因の推定・未知の環境構築は親へ返す | +| Chat側にrepoの取得・編集・テスト・PR作成の実機能がある | 明示承認された工程を6 Proの候補にする。Chatだから実装不可と決めない | +| 分析とローカル実行が分離できる | Codexで証拠取得→6 Proで判断→親または専門子で実装・検証。細かい往復を増やさない | +| Codex側の編集・テスト・新規ログ確認が密に反復する | 複雑な工程はSol。難しい設計前提・重大な不確実性はAstra | +| DB移行、本番変更、セキュリティ境界、不可逆な操作 | 専門判断・復旧条件・受入証拠・明示承認を確認。PR作成はマージや配備の許可ではない | +| 必要な実機・接続・権限がない | 未検証範囲を明示して返す。別環境のテストを実機検証と扱わない | -## 調査・情報収集 +Chatへ実装を任せる時は、repo・base/head・対象範囲、許可するcreate/update/commit/PR等の操作、テスト環境・合格条件をtaskとhandoffへ明示する。機能の提供、対象権限、今回の承認は別々に確認する。承認されない試験書込みで権限確認しない。マージは明示許可とCI・レビュー・対象SHA確認がある場合だけ。現物アクセス不足を別の仕事の成果で埋めない。 -| 条件付き作業 | 第一候補 | 確認方法・完了条件 | 親へ戻す境界 | -| --- | --- | --- | --- | -| 指定した公式ページから現行の項目・版・価格表記を抜き出す。対象URL・項目・期待形式が固定 | Luna/xhigh(全固定条件を満たす時); それ以外はmax | 指定箇所と必須項目を機械照合し、出典リンク付き一覧を保存 | 出典が矛盾する、意味の解釈が必要、取得条件が不明 | -| 決めた検索語・期間・列で複数資料の事実を一覧化する | Luna/max | 各資料・各必須列を対象範囲と照合し、一覧を保存 | 対象の選び方や比較軸を決める必要 | -| 請求書・PDF・スキャン等の必須項目・記載なしを原本で確認する。混在レイアウトや発行日・利用期間・決済日の意味を区別して抽出する場合も含む | Terra/xhigh | OCRや本文が空でも対象ページ全体(ヘッダ、フッタ、隅)を実見し、必要時に拡大。見出し・値・原本位置を全件保存し、発行日を取引日に変換しない | 判読不能、対象資料の意味が曖昧、定義変更、原本と補助情報が矛盾 | -| 曖昧なメール・文書を指定分類に仕分け、例外・欠測を解釈する | Terra/xhigh | 分類根拠と「未確認/判読不能/見つからない/確認範囲内で記載なし」を分けて保存 | 分類規則を新設・変更する必要、重要な対外又は業務判断 | -| 検証済みの分類規則を、固定対象・固定出力に機械適用する | Luna/xhigh(全固定条件を満たす時); それ以外はmax | 規則版・対象件数・各出力を機械照合し、結果を保存 | 新しい例外又は規則外の入力がある | -| 指定URL・PR・チケットの固定状態とリンクを確認する | Luna/xhigh(対象・期待状態・照合方法が固定); それ以外はmax | 対象IDごとの状態とリンクを期待値に照合し、一覧を保存 | 状態の妥当性や次の対応を判断する必要 | -| 少数の候補を既定条件で比較し差分を説明する | Terra/high | 比較表に入力・基準・差分を保存し、指定観点を完了報告で照合 | 重み付け、事業・安全性の選択が必要 | -| 単一機能内の資料・ログの食い違いを原因候補ごとに検証する | Terra/xhigh | 仮説ごとに出典・確認結果・未確認範囲を保存し、反証の有無を報告 | 複数サービスの矛盾解消・複雑な因果関係ならSol/highを候補に再評価 | +## 画像・成果物・データ -## 文章・翻訳 +画像は実際に閲覧できる担当と専用ツールを使う。固定項目の照合と意味・原因判断を分け、正確な寸法・色値・画素差は測定する。資料・表計算の成果物は内容だけでなく表示・式・対象範囲も必要に応じて検証する。全件確認が必要な項目を代表確認で代替しない。数値の合計だけで取得網羅性や親子の使用量範囲を証明しない。 -| 条件付き作業 | 第一候補 | 確認方法・完了条件 | 親へ戻す境界 | -| --- | --- | --- | --- | -| 与えられた文の通常翻訳、要約、既定トーンへの整形 | Luna/max | 入力全文・指定言語/トーン・出力形式を照合し、完成文を保存 | 法務・契約・高影響の意味を確定する必要 | -| 決まったテンプレートに会議メモ・手順・リリースノートを転記する | Luna/max | 必須欄・出典・テンプレート版を照合し、完成版を保存 | 構成や事実関係を新たに選ぶ必要 | -| 既存文面の誤字・表記ゆれ・指定用語を定型校正する | Luna/max | 指定ルールと変更箇所を照合し、校正版を保存 | 主張の正確性、対外影響を評価する必要 | -| 複数資料を読んで提案書・説明文の論点と構成を作る | Terra/xhigh | 資料根拠と各論点を対応付け、指定読者・構成を満たす原稿を保存 | 方針、交渉、公開判断を含む | +## 受入と再配分 -## 表計算・データ - -| 条件付き作業 | 第一候補 | 確認方法・完了条件 | 親へ戻す境界 | -| --- | --- | --- | --- | -| 指定ファイルから固定列を抽出、形式変換、重複照合する | Luna/xhigh(全固定条件を満たす時); それ以外はmax | 入出力件数・固定列・重複規則を照合し、結果を保存 | 定義不明、欠損の扱いを決める必要 | -| 既存の検証済み集計を指定期間・IDで実行し結果を報告する | Luna/xhigh(固定期間・ID・既存手順・期待形式); それ以外はmax | 手順版・期間・ID・期待形式を照合し、実行結果を保存 | 集計ロジックや期間境界を変更する必要 | -| 既定ルールで件数・合計・差分・hashを照合する | Luna/xhigh(固定ルールと期待値); それ以外はmax | 規則版・入力範囲・期待値・実値を機械照合し、結果を保存 | 数値の意味や異常原因を解釈する必要 | -| データ定義、結合、集計式、可視化の設計を行う | Terra/xhigh | 定義・式・入出力例を指定要件に照合し、設計又は成果物を保存 | 会計・法務・重要な意思決定の結論を出す | -| 欠測、タイムゾーン、累積値、複数系統の不整合を調査する | Terra/xhigh | 系統ごとの範囲・定義・再現結果を保存し、欠測と不一致を分けて報告 | 基幹データの修正や高影響の判断が必要 | - -## コード・テスト - -| 条件付き作業 | 第一候補 | 確認方法・完了条件 | 親へ戻す境界 | -| --- | --- | --- | --- | -| 指定ファイルの定数・参照箇所・既知パターンを探索する | Luna/max | 検索範囲と一致箇所を保存し、対象ファイルを漏れなく列挙 | 仕様や依存関係の解釈が必要 | -| 内容が一意で低影響の局所修正、入力と期待結果が決まった既存パターンのテスト追加 | Luna/max | 指定差分と既存パターンを照合し、対象テスト又は固定確認を保存 | 仕様や検証観点を選ぶ必要、設定・依存・権限等への影響拡大 | -| 既存コマンドで単体・結合・E2Eテストを実行し合否を照合する | Luna/xhigh(手順・入力・期待結果が固定); それ以外はmax | 対象revision・コマンド・成功/失敗/skipを固定判定規則と照合して保存 | テスト設計、失敗原因、環境差を判断する必要 | -| 原因と対処方針が確認済みで、未知依存・例外が少ない単一機能の局所修正を実装する | Terra/high | 確認済みの原因・方針・受入条件に対応する差分と検証結果を保存 | 原因又は方針が未確定、設計前提・互換性・複数モジュールの判断が必要 | -| 受入条件が明確な機能、UI、限定リファクタリングを通常の調査・実装・検証まで行う | Terra/xhigh | 受入条件に対応する差分と必要な検証結果を保存 | 設計と担当範囲が確定したまま、多数の境界条件・組合せを深く詰める必要がある時はTerra/max | -| 設計と担当範囲は確定しているが、多数の互換性条件・境界値・組合せを深く詰める実装又はテスト設計 | Terra/max | 条件表・影響境界・検証観点を明示し、関連結果を保存 | 前提自体の再検討、複数モジュールの原因判断、競合条件の反証が必要 | -| 複数モジュールにまたがる互換性修正、根因が難しい不具合、矛盾証拠を含む重要レビュー | Sol/high | 影響境界・原因根拠・互換性条件・検証観点を明示し、関連結果を保存 | 設計前提の再検討、複雑な因果、難しい反証又は競合条件が必要ならSol/xhigh | -| 設計前提を再検討し、複雑な因果や競合条件を反証して解く必要がある実装・レビュー | Sol/xhigh | 前提、反証候補、競合条件、受入根拠を対応付けて保存 | 重大判断、承認、専門確認はAstra親へ戻す | - -## 画像・UI・資料 - -| 条件付き作業 | 第一候補 | 確認方法・完了条件 | 親へ戻す境界 | -| --- | --- | --- | --- | -| 実画像で指定ラベル、要素、見切れ、基準画像との差を定型確認する | Luna/max | 実画像を開き、候補ラベル・見切れ・指定差分を基準画像と照合して保存 | 改善案、原因、品質基準を新たに判断する必要。画像を実際に閲覧できない時も未確認として親へ返す | -| 既定テンプレートへ画像・数値・文章を差し込み資料を整える | Luna/max | 必須領域・入力値・出力形式を照合し、完成資料を保存 | 構成、表現、ブランド判断を行う必要 | -| 仕様から画面の確認観点、境界値、アクセシビリティ項目を選ぶ | Terra/xhigh | 仕様の各要件を観点・境界値・確認方法に対応付けて保存 | 複数画面の体験設計や優先順位を決める | -| 未知の画面不具合を観察し原因仮説と改善案を整理する | Terra/xhigh | 再現画面・観察事実・仮説・確認結果を保存 | 大規模なデザイン方針・ブランド判断が必要 | -| 既知の画面で固定手順の操作・入力・チェックを行い、指定結果と照合する | Luna/max | 画面条件・操作結果・指定期待値を照合して保存 | 未知の分岐、公開・購入・削除等の判断が発生。専用ツールと承認範囲に従う | - -## Git・CI・配信 - -| 条件付き作業 | 第一候補 | 確認方法・完了条件 | 親へ戻す境界 | -| --- | --- | --- | --- | -| 指定branch・PR・CI・デプロイの固定状態を取得し一覧化する | Luna/xhigh(対象と期待状態が固定); それ以外はmax | 対象ID・revision・期待状態を照合し、リンク付き一覧を保存 | マージ可否や配信内容を評価する必要 | -| 既定チェックを実行し、対象revision・成功・失敗・skipを記録する | Luna/xhigh(固定CI・revision・判定規則); それ以外はmax | 固定CI・revision・判定規則と実行結果を照合して保存 | 失敗の原因・必要な検証を選ぶ必要 | -| 確認済みの差分を指定ファイルだけcommitし、承認範囲内で既定手順のPR下書きを作る | Luna/max | 指定ファイル・差分・commit・下書き内容を照合し、PRリンクを保存 | 予期しない差分、競合、公開範囲の変更、マージ判断 | -| Solの理解力を要する限定PRレビュー。論点・対象差分・受入条件が明確で広い探索を要しない | Sol/medium | 受入条件・差分・検証結果を対応付け、指摘又は承認根拠を保存。既存担当で済む短い確認だけを新規Solへ渡さない | 複数モジュール整合、矛盾証拠、互換性又は重要影響を判断する必要 | -| 通常のPR差分を仕様・回帰・保守性の観点で調査・レビューする | Terra/xhigh | 受入条件・差分・検証結果を対応付け、指摘又は承認根拠を保存 | 複数モジュール整合、難しい原因又は互換性ならSol/highに再評価 | -| PRの重要差分、マージ可否、本番で期待した内容が配信されたかを受入条件で判断する | 親の選択モデル(Astra親なら親) | 差分・CI・配信revision・外部確認を受入条件に照合して根拠を保存 | 親が下位でAstraの確認が必要なら、委譲条件を満たす限定レビューを使う | - -## サーバー運用 - -| 条件付き作業 | 第一候補 | 確認方法・完了条件 | 親へ戻す境界 | -| --- | --- | --- | --- | -| 指定ホストのヘルス、容量、プロセス、監視値を取得する | Luna/max | 指定時刻・対象・値・取得元を保存し、未取得と異常値を分けて報告 | 値の原因や復旧方針を判断する必要 | -| 承認範囲内で低影響・手順固定の可逆操作を実施し結果を確認する | Luna/max | 操作前後の状態と復帰方法を照合し、結果を保存 | 本番変更・削除・権限変更等の影響判断が必要なら着手前に親へ返す | -| 原因と復旧方針が確認済みで、未知依存・例外が少ない単一サービスの障害を修正する | Terra/high | 再現条件・確認済みの原因と方針・ログ/設定根拠・確認結果を保存 | 複数サービス・ネットワーク・認証、又は原因未確定が絡む | -| 既存構成内の難しい障害、複数モジュールの互換性、復旧手順を検討する | Sol/high | 影響・復旧条件・検証計画を保存し、未確定前提を明示 | 設計前提の再検討、データ損失、高影響の本番判断 | - -## 自動化・事務・業務判断 - -| 条件付き作業 | 第一候補 | 確認方法・完了条件 | 親へ戻す境界 | -| --- | --- | --- | --- | -| 既定条件で予定・台帳・タスク・定型連絡の候補や下書きを整える | Luna/max | 指定条件・必須欄・下書き状態を照合し、成果物を保存 | 送信・登録・対外確約へ進むなら既存の承認範囲を確認。未承認分は実行しない | -| 定義済みの条件で監視結果を集め、未達だけを報告する | Luna/max | 定義済み閾値・対象範囲・未達一覧を照合し、結果を保存 | 閾値、例外、対応優先度を変更する必要 | -| 通常の業務フローを比較し、必要な入力・手順・抜けを整理する | Terra/xhigh | 指定フロー・必要入力・差分を対応付け、比較結果を保存 | 会社・契約・税務・人事の意思決定を行う | -| 複雑な料金体系・継続条件・例外を照合し、指定条件で比較根拠を整理する | Sol/high | 条件・例外・出典・比較式を保存し、適用範囲を明示 | 事業上の重要比較・予算・採用方針の決定は親が担当。限定された既定条件の比較はTerra/high | -| 決定済みの入力・分岐・終了条件に沿って通常の自動化を実装する | Terra/xhigh | 決定済み条件と実装・通常経路の検証結果を対応付けて保存 | 再実行・外部書込み・例外処理の設計や影響が当初範囲を超える | -| 要件・構成・優先順位・予算・採用方針を決め、全体の品質とリスクを判断する | 親の選択モデル(Astra親なら親) | 選択肢・根拠・リスク・ユーザー決定を保存し、受入根拠を明示 | 必要な専門確認・ユーザーの決定権を維持。独立した重要レビューだけ適切な子へ | +子の結論・重要差分・証拠・前提・反例・未解決点を受け取る。親の取りまとめと専門判断を分け、同じ分析やテストを理由なく全面再実行しない。設計変更・範囲拡大・矛盾・検証不能・同じ失敗は親へ返す。effortは固定しても担当や合格条件を固定しない。接続・権限・材料不足をモデル変更で解決したと扱わない。 diff --git a/tests/fixtures/model-routing-handoff.md b/tests/fixtures/model-routing-handoff.md index 2371a60..965d37f 100644 --- a/tests/fixtures/model-routing-handoff.md +++ b/tests/fixtures/model-routing-handoff.md @@ -1,42 +1,23 @@ -# モデルルーティング作業 引継ぎテンプレート +# 引継ぎの最小契約 -不要な項目は省略する。選定・階層・観測の正本は `model-routing-policy.md` の該当見出しを参照し、必要な一節だけ読む。 +フォームのために保存物を増やさず、必要な項目だけ使う。全履歴fork・全ログの転送を避ける。元の依頼・重要な制約・必要な原資料は保持し、誤解を担当が指摘できるようにする。 -## 起動時の引継ぎ +## 共通 -- **設定と理由**: [要求 model/effort と対応表の条件を一言。Lunaはxhigh/max(標準max)、Terraはhigh/xhigh/max(標準xhigh)、Solはmedium/high/xhigh(標準high)。実行値は維持と推測しない。指定不能・観測不能は `null` と理由。ユーザーが選んだ親設定は変更しない] -- **目的・成果物・完了単位**: [確定・実装・検証すること、保存先。抽出又は実装 → 依頼された保存 → 必要な検証 → 完了報告までを承認済みの完了単位として進め、途中経過だけで止めない] -- **担当と範囲**: [直接親/root、子の担当範囲、親が並行して担う独立作業、対象ファイル・環境・検証範囲、対象外。再委譲は正本と親の明示した工程内だけ] -- **承認・返却条件**: [許可された読取り・変更・外部操作。取得先の矛盾、解決不能な必須項目欠落、担当・承認範囲外の環境構築・復元・集計ロジック、設計又は影響範囲の変更、承認内の代替がない権限・環境・対象不一致は根拠とともに親へ返す。Lunaの新規構築・復元等の返却条件は正本に従う] -- **根拠・環境・合格条件**: [決定事項とファイル/既存結果/ツール結果ID、cwd・OS・権限・ネットワーク等の制約、受入条件、検証方法。成功・失敗・skip・未実行を分ける] -- **repo 作業時**: [絶対 cwd、期待 repo/worktree・branch/HEAD、既知の対象 diff。指定 cwd で一致を確認し、不一致は別 worktree 探索・checkout・resetへ広げず親へ返す] +目的/担当と固定effort/対象と未解決点/既知の根拠/合格条件/許可済み操作/返却条件を渡す。並列なら親の独立作業、直列なら専門委譲の追加価値とホストが許す根拠を添える。通常作業は親Terra、Terra子は標準外。子は承認済みの通常修正・検証・証拠整理まで同じ担当で進める。 -### 必要な場合だけ追加する条件 +## Codex専門担当 -- **画像**: [子が実見できる画像パス/ツール、基準画像・画面条件・確認項目。不鮮明・未取得は不明。画像の品質評価や意味解釈は Luna の機械照合(xhigh)に含めない] -- **原本・必須項目**: [対象ページ全体(ヘッダ/フッタ/隅)を実見し、必要時拡大。OCR/抽出の空欄を不存在にせず、見出し・値・原本位置と日付の意味を保持。「未確認」「判読不能」「見つからない」「確認範囲内で記載なし」を分ける] -- **定型取得**: [対象 ID・出典/endpoint、必須項目と型、範囲・ページング、0件・実値 `null`・未取得の区別。代表1件で抽出方法を照合してから展開するが、残りの必須項目確認は省略しない] -- **実行方法**: [利用可能なブラウザ等、承認内の代替、スクリプトの対象・保存先・実行・検証方法。未依頼の既存ブラウザプロファイル操作や不安定な複雑 quotingへ広げない] +Luna/maxは明確な定型工程、Sol/highは複雑な実装・原因・重要レビュー、Astra/highは難しい前提・重大判断を担当する。model IDを明示し、再開でも観測値を推測しない。repoでは絶対cwd、repo/worktree、branch/HEAD、対象の未commit差分を示す。不一致をresetや探索で補わせない。 -同じ担当への追加指示は既存の子を優先し、変更要求・追加根拠・合格条件の差分だけ渡す。再開時の設定維持は推測せず、観測不能は不明とする。再開不能、文脈喪失、必要な設定・実行条件を満たせない、能力不足又は範囲変更の場合は未完了分だけ再配分する。無関係な仕事で文脈を膨らませない。直接の子は同時に原則1体とし、起動時は親にも独立した有用作業が必要である。伝言だけの階層や待ちだけの起動は作らない。 +## 通常Chat 6 Pro -## 完了報告 +有効なroot経路で、材料・実ツール・権限・検証環境を確認する。分析だけでなく実装・PR作成も完結可能なら候補とする。taskに具体的な対象と許可操作を明示し、handoffのrequired_information/source_requirements/freshness/allowed_tools/return_format/stop_conditionsをそろえる。allowlistはツール実在や今回の承認の証拠ではない。 -- **結論**: [合格/未達/部分達成と理由] -- **変更**: [ファイルと成果物の保存先・保存確認。変更なしは「なし」] -- **検証**: [確認方法、結果、対象 revision/diff、条件、時刻、証拠の保存先又は既存結果ID。詳細表は必要な時だけ] -- **未解決・判断依頼**: [残課題・制約・親の判断。取得不能、項目欠落、実値 `null`、0件を区別。なければ「なし」] +例:承認済みrepoの指定base SHAから作業ブランチを作り、指定範囲を修正・テストしてPRを作成する。マージ・配備はこの依頼では許可しない。返却にはPR URL、head SHA、重要差分、実行したテスト・環境・結果、未検証範囲を含める。必要な機能がなければ未完了分を返し、Work/APIへ切り替えない。 -回答だけで済む仕事に保存物や検証ログを増やさない。既存の安全な結果を再利用し、証拠のためだけにテストを再実行しない。secretや全ログは記録せず、必要な要約と参照先だけを残す。 +## 結果の受入 -## 親が観測対象とした作業だけ +結論、重要差分、合格条件との照合、検証方法・cwd・環境・終了コード・時刻・revisionと対象差分、根拠の参照、前提・反例・未解決点を必要な範囲で返す。成功/失敗/skip/未実行を区別する。HTTP成功・null・0件を不存在や完了としない。安全に残せない証拠は理由付き欠測とする。 -- [親が予約した共通task_id・sampling_keyと返却先を使い、子・孫は別の観測枠を取らない。親は最終報告前にその記録を更新する。欠測は理由付きnullで閉じ、記録完了と実測が揃った状態を区別する] -- [起動 call_id 又は結果参照、返却 task 名、直接親/root ID、親 threadId/turnId、要求設定、起動時刻を対応付ける。task名を UUID と扱わず、取得不能な ID は理由付き `null`] -- [初回起動、再開、追加指示の各 turn を分け、各 turn の call_id・親/root ID・時刻・要求 model/effort と観測 model/effort を記録する。再開後の現設定や self-report から過去の実行設定を推測しない] -- [確認できた threadId/agentId UUID、メタデータ参照、単一 turn 抽出の結果、入力/cache/出力/時間を記録する。取得できない値だけ理由付き `null`。子完了後に一度、抽出結果と記録対象の一致を照合する] -- [進行中の親 turn の最終利用量と比較基準のない節約率は `null`。cache の包含を明記し、推論分を二重計上しない。階層全体の集計は対象 turn と包含範囲を確認できる時だけ行う。孫の記録は直接親が保持し root には参照を返す] - -完了turnの差分は最初の応答より前の累積基準を使う。応答後の値しかない場合は途中区間として残し、全量として比較しない。観測のためだけに再実行せず、記録CLIと入力例はスキルの `references/observation.md` を参照する。 - -短い確認と観測対象外の作業にはこの記録を作らず、毎回全フォームを埋めない。 +親は重要な条件と証拠を確認し、同じrevision・diff・環境の有効な結果を再利用する。追加確認は変更・矛盾・失敗・証拠不足へ絞る。重大な専門判断を自己申告だけで受け入れず、同じ判断を別Astraに重複させない。必要な人の承認は維持する。 diff --git a/tests/fixtures/model-routing-policy.md b/tests/fixtures/model-routing-policy.md index 0079cfe..57f05ef 100644 --- a/tests/fixtures/model-routing-policy.md +++ b/tests/fixtures/model-routing-policy.md @@ -1,34 +1,30 @@ -# モデル選定・作業内の委譲(2026-09-14更新) +# モデル選定・作業内の委譲(2026-09-15更新) -作者の既定方針:Astraを親に残して方針・設計・重要レビュー・最終判断を確認し、実作業は必要な品質を満たす軽い子へ渡す。ユーザー向けのモデル・effort・Ultraの切替提案機能は廃止する。ユーザーがLuna/Terra等から始める選択も尊重し、その親から適切な子へ委譲する。この版の方針は、品質を保ちながら速度より総トークンと利用負担を優先すること。並列化・階層化・effortの分散自体を目標にしない。以下は作業内の運用基準であり、モデルの性能保証ではない。 +作者の基準運用は親Terra/xhigh、子Luna/max・Sol/high・Astra/high、適合工程は通常Chatの6 Proを積極的な主担当とする。通常作業と進行を親で完結し、専門工程だけ渡す。Terra子は標準ルートから外す。これは性能・節約の実証ではなく比較する運用方針である。 -親会話のモデル・effort(Ultra含む)はユーザーが選んだ設定を維持する。回答末尾の「次の送信:モデル/effort」、昇格・降格の勧め、切替を促す定型案内やその例外条件は設けない。許可済み作業内のサブエージェントの起動とモデル・effort選択は、後述の条件でAIが行う。通常作業や可逆的な実装判断すべてをユーザーに戻すルールではない。 +親モデルを自動変更する機能ではない。利用者の親のmodel・effort(Ultra含む)と既存overrideを保持し、次回送信の切替提案はしない。別モデル親でも、能力に合う作業は親・適合する既存担当で進め、専門判断を必要な担当へ渡す。通常の可逆的な作業は承認内で進め、毎回の続行確認を増やさない。 -### 子のeffortの既定値(2026-09-14対応表反映) +### 子のeffortの固定値と互換性 -下表を新規割当て・再配分時の基準とし、ユーザーが選んだ親の設定は維持する。表示名は最高=`max`、極高=`xhigh`、高=`high`、中程度=`medium`(`middle`という設定値は使わない)。 +| 担当 | 自動選定に使う有効な固定値 | 役割 | +| --- | --- | --- | +| Luna子 | max | 明確な定型工程 | +| Sol子 | high | 複雑な実装・原因・重要レビュー | +| Astra子 | high | 難しい設計・重大な不確実性 | +| Terra | xhigh | 親の基準。子は標準ルート外 | +| 通常Chat 6 Pro | UIの6 Pro | 別経路。Codex effortと換算しない | + +固定するのは自動選定の基準であり、合格条件ではない。子の推論を十分使い、親の再指示・再調査を減らす。担当外なら固定値で押し切らず、未解決工程を適任へ直接渡す。Astraでも不十分なら根拠と制約を返し、無意味な再試行や合格基準の引下げはしない。 -| 子モデル | 下限 | 標準 | 上限 | -| --- | --- | --- | --- | -| Luna | xhigh | max | max | -| Terra | high | xhigh | max | -| Sol | medium | high | xhigh | +`min_effort`・`max_effort`は既存設定と部分overrideの範囲検証用として保持し、毎回の自動選定の候補にしない。利用者が明示した有効なoverrideを優先する。親の実設定はこの表で上書きしない。子の再開時も設定維持を推測せず、要求値と取得できた観測値を区別する。利用不能な値に黙って置換しない。low・none・minimal・Ultraは自動選定しない。 -- モデルを担当能力で選んでから、下記「作業内で使う推論強度と実行条件」の具体的な条件を当てる。Lunaの機械照合はxhigh、通常取得・一意の局所修正はmax。Terraは原因と方針が確定した小変更・限定比較だけhigh、通常の調査・実装・原本網羅確認はxhigh、前提確定の多数の境界条件を深く詰める仕事はmax。Solは広い探索を要しない限定調査・レビューだけmedium、複雑な整合・原因・互換性・重要レビューはhigh、難しい前提再検討・反証・競合条件はxhigh。 -- 具体的な作業条件を標準値より優先し、引継ぎに理由を一言残す。件数・名称・安心感だけで上げ下げせず、effortの比率を目標にしない。適合する既存担当の短い残作業は、そのためだけに再配分しない。画像の目視評価・意味解釈をLunaの機械照合へ含めない。 -- 下限未満・上限超のeffortは自動選定しない。low・none・minimal・Ultraも自動選定しない。上限でも担当能力が足りなければ親へ戻し、未完了部分のモデルを見直す。Luna/max、Terra/xhigh、Sol/highが同等の能力や料金になるという換算ではない。Astraの子が必要な場合は既存の担当・委譲条件に従い、親の選択を変更しない。 -- この表は手戻りを含む総負担を減らすためのユーザーの運用基準であり、性能・節約の実測結果ではない。effortを上げても担当範囲・承認・検証条件は広げず、簡単な仕事に不要な説明やテストを足さない。完了済みの仕事を新設定でやり直さない。 -- 新規起動・再配分時はmodelとeffortを明示する。再開時も初回設定が保たれると仮定せず、要求値と取得できた実行値を分ける。必要な設定を使えない場合は下限未満へ黙って落とさず、未着手のまとまった仕事を適切な子へ渡すか親で進める。実行中の子を設定統一だけのために中断しない。 -- [公式のサブエージェント仕様](https://learn.chatgpt.com/docs/agent-configuration/subagents)と[effortの説明](https://learn.chatgpt.com/docs/models?surface=app)を2026-09-14に確認。強いeffortは時間・トークンを増やし得る。API単価をCodex契約の消費率へ直接換算せず、使えるmodel/effortは実行時の機能で確認する。 +[公式サブエージェント仕様](https://learn.chatgpt.com/docs/agent-configuration/subagents)を実行時にも確認する。設定値は実行モデルの証明ではない。 ### 選定のタイミングと基準 -- 着手時に担当を選び、計画確定・工程移行時は必要な判断能力や範囲が変わったかだけ確認する。変わらなければ同じ担当を継続し、モデル選定や共通方針の読み直しを繰り返さない。前提・難易度・実際の手戻りが変わった時に再評価する。 -- 「調査/実装」の名前や作業量だけで選ばず、仕様・情報源の明確さ、判断の複雑さ、影響範囲、誤りを検証できるかで選ぶ。工程の見積もりと同様に、方針・設計・実行・検証をさらに判断の必要量で分け、必要な品質を満たす軽い担当へ割り当てる。人の作業単価をそのままモデルへ対応させず、引継ぎ・親の確認・手戻りを含めた総負担を小さくする。 -- 親がAstraなら方針・重要レビュー・最終判断を親に残し、軽い工程は適切な子へ任せる。親のモデルやeffortを維持することと、親が全実作業を行うことは分ける。 -- 再評価条件はAIの内部の選定基準として使い、毎回の回答へチェックリストとして出さない。モデルの割当ては必要な進捗・結果報告やユーザーからの質問への回答で説明する。 -- 一往復で終わる軽微な依頼では選定説明や委譲の負担を増やさず、その場で完了する。 -- ユーザーのモデル指定と委譲範囲を尊重する。必要な確認を実施できない場合は不足する根拠や機能上の制約を報告し、確認済みと扱わない。 +短い仕事は現在の適任者で終える。まとまった工程の開始時に、目的・未確定な判断・必要情報・ツール・合格条件・承認範囲を確認する。分類専用のモデルを起動しない。有効なChat経路ならまず適合を検討し、Codex側で同じ分析を先に済ませない。必要な判断能力と現物へのアクセスから担当を直接選ぶ。 + +新しい矛盾・範囲変更・必要機能の欠如が分かった時だけ再分類する。自信の自己申告や件数だけで決めない。既存担当への差分指示を優先し、effort選択のために細分化しない。 ### 方針を読む範囲 @@ -38,82 +34,59 @@ ### 作業分類と第一候補 -以下は仕事を担当するモデルの候補であり、親モデルの切替表ではない。Astraが親なら、下位モデルに割り当てられる仕事は子へ切り出し、重要な確認と統合はAstraに残す。具体的な仕事の分類は同じディレクトリの `model-routing-catalog.md` にまとめる。該当分野だけ参照し、この文書の委譲条件・担当を見直す境界を適用する。 +入口の選択は能力、利用環境、引継ぎ負担で決める。モデルの上下だけの一本道にしない。通常Chat経路のopt-in・利用条件・実際の機能がそろう場合、まとまった工程は6 Proを第一候補にする。文案だけでなく、承認されたツールと検証環境で完結する実装・PR作成も候補である。 -事前分類は、繰り返す担当選びの判断を減らし、下位へ任せられる部分と上位が確認すべき部分をそろえるための既定値。該当する具体的な条件とeffortを先に選び、未掲載の仕事だけ下表の近い条件を使う。名称だけで一律に割り当てない。複数条件が混在し分離できない場合は、正しい完了に必要な判断へ合わせる。独立したまとまった定型工程を切り出せる時だけ別の軽い担当を検討し、effortのためだけに細分化しない。情報源や合格条件が曖昧なら、Lunaでの試行を必須にせず必要な判断能力から選ぶ。モデル選定は実際の利用可否・ツール要件・既存の承認範囲に従う。 +| 条件 | 第一候補 | +| --- | --- | +| 短い確認・整形・局所修正、通常の調査・実装・検証 | 親。基準運用はTerra/xhigh | +| 明確でまとまった取得・抽出・照合・既定手順 | 委譲が見合えばLuna/max | +| 材料がそろう比較・分析・要件・設計・文案・レビュー | 有効な通常Chat 6 Proを最初の主担当候補 | +| 接続先の取得・編集・テスト・PRまで対象と承認が明確 | Chat側の実能力で完結すれば6 Pro。名称だけで不可にしない | +| Codex側のコード・テスト・新規ログ照会を繰り返す複雑な工程 | Sol/high | +| 難しい設計前提、重大な不確実性、現物と密な往復が必要 | Astra/high | +| 原本の網羅・日付・欠測・曖昧な分類 | 親Terra、または原本を実見できる6 Pro。Lunaの機械照合にしない | +| 承認・必須情報・権限が不足 | 不足を報告。モデル変更だけで補完しない | -| 作業 | 条件・例 | 第一候補/推論強度 | -| --- | --- | --- | -| 単純な事実調査 | 指定ページ・公式資料の特定項目、現行バージョン、設定値、PR状態を出典付きで確認 | Luna/max | -| 一覧化・抽出・照合 | 固定入力・列・件数・hash等を検証済み手順で機械照合し、解釈を要しない低影響の仕事 | Luna/xhigh。条件を外れれば原則maxまたは担当を再評価 | -| 要約・整形・定型作成 | 与えられた内容の要約、通常の翻訳、文言修正、既定書式への変換 | Luna/max | -| 定型操作・検証実行 | 固定環境・既存コマンド・固定の合否判定による低影響の操作やテスト実行 | Luna/xhigh。未知の分岐や解釈を含めない | -| 画像の定型確認 | 実画像を見て、指定した文字・要素の有無、見切れ、基準画像との差異を既定項目に沿って確認 | Luna/max。画像を確認できる実行環境が前提 | -| 通常のテスト設計・画像分析 | 仕様から確認観点や境界値を選ぶ、画面の問題を整理し原因・改善案を検討 | Terra/xhigh。前提確定の多数の境界条件はTerra/max、前提や原因自体の判断はSol/high | -| 局所的な小変更 | 修正内容が一意、依存が少ない、差分と結果を直接検証できる | Luna/max | -| 限定比較 | 項目の意味・比較範囲・判定条件が明確で未知の例外が少ない少数資料の比較 | Terra/high | -| 原本の網羅確認・日付や欠測の解釈 | 異なる帳票レイアウト、必須項目の見落とし確認、発行日・利用期間・決済日の区別、記載なしの判断 | Terra/xhigh。下記の原本確認条件を適用 | -| 曖昧な文書・メールの分類 | 複数の意味候補、例外、欠測や矛盾を根拠付きで判定 | Terra/xhigh。検証済み規則の機械適用とは分ける | -| 範囲を絞れる不具合調査 | 再現可能で、ひとつの機能・サービス内のコードとログから原因候補を検証する | Terra/xhigh | -| 原因・方針確定の小修正 | 原因と修正方法が既知で、未知の依存や例外が少ない限定変更 | Terra/high | -| 方針が確定した通常実装 | 受入条件が明確な機能追加、UI変更、限定的なリファクタリングと適切な検証 | Terra/xhigh | -| 通常の成果物レビュー | 明確な仕様・範囲・期待値との整合、回帰、読みやすさを検証。原本の網羅確認や高影響の判断を含まない | Terra/xhigh | -| 複雑な調査・比較 | 資料の矛盾や例外を解消、複数サービスの因果関係、詳細な費用・運用条件の分析 | Sol/high | -| 判断を伴う複雑な実装 | 既存設計内で複数モジュールを調整、互換性維持、難しいテスト設計・原因修正 | Sol/high | -| 重要なレビュー | 認証・課金・個人情報・DB移行・本番運用に影響する変更の妥当性判断 | Sol/high。設計横断・不可逆性・重大な不確実性があればAstra/high | -| 方針・設計・意思決定 | 要件整理、構成・移行戦略、運用ルール、事業上の重要な比較、品質・費用・安全性のトレードオフ | Astra/high | -| 難解な問題・重大判断 | 複数システムにまたがる原因不明障害、設計前提の崩壊、重大で取り消しにくい判断 | Astra/high。必要な場合のみxhigh | - -- 単純調査のLuna条件は「何を、どこで確認し、何をもって回答できるか」が明確なこと。最新情報でも取得・照合だけならLunaでよい。情報の矛盾、原因推定、重大な判断が加わった段階で分類し直す。 -- 認証・課金・税務等の話題でも、事実の収集と意思決定を分ける。Lunaが公式情報を集めることは可能だが、重大な解釈・変更判断を単純作業に分類しない。上位モデルでも公式根拠や必要な専門確認は省略しない。 -- 本番操作は短い手順でも影響と検証可能性を考慮する。高影響の操作はSol以上を候補にする。モデルの選定は既存の承認条件を変えない。 -- PRレビューやマージ可否は、手順が明確でも差分の妥当性・回帰・影響を判断する必要がある。配信確認でも、状態の取得と期待した内容が配信されたかの評価を分ける。親がAstraなら重要な差分・根拠・受入条件を親が確認し、CI結果・配信状態・既定項目の取得や照合等は適切な子へ任せる。軽微な変更まで別のAstraを追加して全件再レビューする運用にはしない。 -- 高影響な要約・翻訳、未知の画面で分岐判断が多い操作、複雑な表計算・資料作成等は、上表の判断量に合わせて上げる。生成画像等は適した専用ツール・スキルも使う。 +Chat不適合ならCodex側の適任へ渡す。認証・課金・個人情報・DB移行・本番操作等は影響と不可逆性を評価し、専門判断と人の承認を維持する。詳細な分野別条件は分類表の必要節だけ読む。 ### テスト・画像確認を切り分ける基準 -- **実行・照合:** 対象環境・既存コマンド・期待する機械的な合否判定が固定された低影響の検証は、例外条件を満たせばLuna/xhighを第一候補とする。失敗原因の調査や環境構築へは広げない。実画像の指定ラベル・見切れ・基準画像との差の確認はLuna/maxを原則とする。画像を見て判断することと、検証済みツールの固定数値を機械照合することを混同しない。 -- **作成・分析:** 入力と期待結果が一意で、既存パターンに沿った局所的なテスト追加はLuna/maxの候補。何を検証すべきか、期待結果が正しいか、失敗原因やUIの改善策を考える必要があればTerra以上へ見直す。設計と範囲が確定した多数の境界条件の検討はTerra/max、非決定的な失敗や複数機能の相互作用から原因自体を判断する場合はSol/highを使う。要件と重要な受入判断はAstraが親なら親に残す。 -- **証拠と限界:** テストは対象revision・差分・環境に加え、成功/失敗/skip/未実行を区別する。画像は子がアクセスして実際に閲覧できる画像パスや対応ツール、確認範囲・基準画像・比較に必要な画面条件を渡す。親の文章やDOMだけから画像を見たと扱わず、不鮮明・未取得は不明とする。正確な寸法・色値・画素差が必要なら測定ツールで確認する。 -- 合格した項目の範囲を明示し、テストの成功や画像の一部確認から全体の品質を断定しない。親は重要な証拠・差分と受入条件を確認し、対象・条件が同じ既存結果を再利用する。短い検証だけを細分化して子を増やさず、既存の委譲条件に従う。 +既存コマンド・固定環境・機械的な合否判定だけの検証はLuna/maxの候補。失敗原因の推定や新規環境構築へ勝手に広げない。仕様から観点を選ぶ通常のテスト設計・画像分析は親Terraが行い、複雑な原因や互換性の判断はSol、難しい前提はAstra。必要な素材とツールがそろう工程はChat候補も検討する。 + +画像の指定ラベル・見切れの照合でも実際に閲覧する。親の説明やDOMだけで実見したと扱わず、不鮮明・未取得は不明とする。寸法・色値・画素差は測定する。テストは対象revision・未commit差分・環境と成功/失敗/skip/未実行を分け、成功した一部から全体の品質を断定しない。 ### 原本・必須項目・記載なしを確認する条件 -- 既知の場所にある指定ラベルを照合する仕事と、どこに何が記載されているかを網羅的に探す仕事を分ける。後者や日付の意味・例外を判断する工程はTerra/xhighから始める。実際の見落としや手戻りが判明した条件は、モデル・effort・確認手順の組合せを見直してから同種の未着手作業へ適用する。effort変更の効果を確かめるだけの再実行はしない。 +- 既知の場所にある指定ラベルを照合する仕事と、どこに何が記載されているかを網羅的に探す仕事を分ける。後者や日付の意味・例外を判断する工程は、原本を実見できる親Terraまたは有効なChat経路の6 Proを候補にする。実際の見落としや手戻りが判明した条件は、モデル・effort・確認手順の組合せを見直してから同種の未着手作業へ適用する。effort変更の効果を確かめるだけの再実行はしない。 - 原本の必須項目を確認する時は対象ページ全体を実見し、ヘッダ・フッタ・四隅も確認する。小さい文字や判読しにくい箇所は必要時に拡大する。OCR・抽出テキストだけの空欄を記載なしと扱わない。形式ごとの代表1件で抽出方法を照合してから展開するが、残りの各対象の必須項目確認を省略する根拠にはしない。 - 値と取得状態を分け、未確認/判読不能/探索したが見つからない/指定範囲を全て確認したうえで記載なしを区別する。確認済みとする範囲と根拠のページ・位置を残し、全件nullや予想外の欠測は取得方法と範囲を再確認する。範囲外の不存在へ一般化しない。 - 日付は原本上の名称・値・位置を保つ。発行日、利用期間、決済日、取引日を混同せず、依頼された列への対応は合意済みの定義に従う。未定義なら元の値を保存して対応判断を親へ返し、発行日を勝手に取引日へ変換しない。通常の資料整理から税務等の重大判断へ広げない。 ### Lunaを検討するタイミング -- **着手時:** 親が対象・出典または操作・合格条件を把握したら、まとまった定型作業をLunaへ渡せるか先に判断する。指定資料の項目収集、複数ログから決まった値の抽出、複数PRのCI状態一覧等。Lunaを候補とし、固定手順・固定期待値の低影響な機械照合ならxhighを選ぶ。それ以外の担当範囲内の取得・照合は原則maxとする。調査という名前だけでTerraへ固定しない。 -- **方針や原因が確定した後:** 残作業を再評価し、修正内容が一意で局所的な変更、既定形式の文書作成、既存テストの実行と合格条件の照合ならLunaを候補にし、前述の機械的な検証条件を満たすものはxhighとする。仕様確定済みでも通常の機能実装や依存関係の判断を伴う仕事はTerra以上を候補にする。 -- **レビュー・配信確認時:** 既に必要な確認項目が決まっている場合、まとまった事実取得をLunaへ任せ、重要な差分・影響・マージ可否・配信内容の評価は親が行う。Lunaを使うためだけの追加レビューやテスト工程は設けない。 -- いずれも親に独立した有用な仕事があり、子が親の作業を代替できる場合に起動する。1〜2回の確認で終わる仕事は親で完了し、稼働中の子が持つ文脈を捨てて短い残作業だけ別のLunaへ渡さない。Lunaの利用件数を目標にしない。 -- 矛盾、原因推定、仕様選択、影響拡大が判明したら根拠を親へ返して担当を再評価する。親がTerraでも同じLuna基準を使い、親のモデル設定は変えない。 +Luna/maxへ渡すのは、取得元・手順・必要項目・合格条件が明確で、まとまった工程を代替できる時。親の短い確認を移すだけ、全件を親が先に取得してから再取得させるだけの起動はしない。 + +指定資料の抽出、一意の局所修正、既存テスト実行の候補を使い、原本の欠測解釈・複雑な日付・原因推定・未知の環境構築は親へ返す。件数が多いことだけを上位モデルや細かな分割の理由にしない。 ### 定型取得の合格条件と担当を見直す境界 - 取得を任せる時は対象ID・出典/API endpoint、必要な項目と型、ページング・対象期間、0件と未取得を見分ける条件を必要な範囲で渡す。既に根拠がある対応表を使い、親が全対象を先に取得する必要はない。取得先を探す通常調査と、原本の網羅確認・意味の区別・曖昧な分類・欠測の解釈はTerra/xhighを標準とする。 - 同じ方法で複数件を取る場合、子が最初の代表1件で取得先・応答項目・型・対象を確認してから展開する。200応答でも必須項目がなければ、その値は確認できていない。404・403・省略された項目・null・0・空配列を同じ「なし」にまとめず、取得状態と実値を区別する。親の再取得を必須化せず、親は重要判断や矛盾のある部分の根拠を確認する。 - 全件nullや予想外の0件、資料にある実体が見つからない場合は、参照先・絞込み条件・取得範囲を一度照合する。明白な抽出箇所の訂正で解決できれば担当内で直し、なお不明・矛盾が残るなら取得済み結果と未取得理由を親へ返す。HTTP成功や検索結果なしだけを、対象の不存在・安全性の根拠にしない。 -- Lunaへの取得依頼から、失効した成果物の復元、新規の依存環境構築や未指定の再ビルド、原因推定、複数履歴の統合へ進む必要が出たら、代替作業へ着手する前に親へ戻す。親が必要性を判断し、通常はTerra/xhighへ再配分し、前提や能力の境界が変われば対応表でモデルを見直す。検証済みの既存コマンドを指定環境で実行する仕事はLunaの候補に残し、effortは前述の固定手順の例外条件で選ぶ。権限・ログインの問題はモデルを変えれば解決すると扱わない。 -- タイムゾーン・再開区間・親子の所属・累積値を扱う集計処理の新規実装や修正は、定型抽出と分けてTerra/xhighを標準とし、前提確定の多数の組合せ検証はmax、集計定義の矛盾や前提自体を判断する場合はSol/highを候補にする。Lunaは検証済み処理を指定対象に実行し、決まった項目を返す範囲に使える。期間の集計では日時型、明示したID、開始前からの継続と新規開始、進行中と完了、欠測・resetを分ける。件数やモデル比率は元の各行と親子関係へ戻して確認し、自己申告の合計だけを採用しない。 +- Lunaへの取得依頼から、失効した成果物の復元、新規の依存環境構築や未指定の再ビルド、原因推定、複数履歴の統合へ進む必要が出たら、代替作業へ着手する前に親へ戻す。親が必要性を判断し、通常は親Terra/xhighが引き取り、前提や能力の境界が変われば対応表でモデルを見直す。検証済みの既存コマンドを指定環境で実行する仕事はLunaの候補に残し、effortは有効な固定値を使う。権限・ログインの問題はモデルを変えれば解決すると扱わない。 +- タイムゾーン・再開区間・親子の所属・累積値を扱う集計処理の新規実装や修正は、定型抽出と分けてTerra/xhighを標準とし、集計定義の矛盾や前提自体を判断する場合はSol/highを候補にする。Lunaは検証済み処理を指定対象に実行し、決まった項目を返す範囲に使える。期間の集計では日時型、明示したID、開始前からの継続と新規開始、進行中と完了、欠測・resetを分ける。件数やモデル比率は元の各行と親子関係へ戻して確認し、自己申告の合計だけを採用しない。 + +### 親への返却と専門担当への再配分 -### 親への返却と上位の子への再配分 +担当外の判断、設計変更、承認境界、重大な影響、矛盾、検証不能を検出したら根拠と残作業を親へ返す。具体的な修正・妥当な仮説の検証を行っても同じ問題や新情報のない状態が続く時は再評価し、無意味に2回試す義務はない。 -子は以下を検出したら根拠と未解決点を親へ返す。親は必要な判断を引き取るか子を再配分する。親が下位モデルでAstraの確認が必要な場合は、独立した有用なレビューとして委譲条件を満たす範囲をAstraの子へ任せる。実行していないAstraの確認を完了済みと扱わず、ユーザーのモデル指定と本番操作等の承認範囲を守る。必要な委譲ができない場合は、実施可能な作業を進めたうえで未解決点と制約を報告する。 +親が下位モデルでもSol/Astra、または有効なChat経路の6 Proへ直接渡してよい。順番に一段ずつ上げない。問題分割や合格条件の設計が難しければ、その工程自体を専門担当へ任せる。根拠・前提・反例を回収し、未実施の専門レビューを済みとしない。 -- 開始前に上位の分類に該当すると分かった時点で担当を見直す。失敗するまで待たず、親はLunaの担当範囲をSol/Astra等の子へ直接再配分してよい。再配分は既定で親が行う。後述のTerraへの進行委譲を明示した場合だけ、その範囲内のLuna起動を認める。 -- 公式情報・実測・コードが矛盾し、通常の照合で解消しない。原因の説明に未検証の推測が必要になる。 -- 当初の範囲を越える依存、設計変更、仕様の選択、セキュリティ境界、高影響のデータ操作が判明した。 -- 異なる妥当な仮説を2つ検証しても証拠が増えない、または修正と検証を2回行って同じ問題が残る。回数は再評価の目安であり、無意味な試行や2回待つことを要求しない。 -- 受入条件を満たした根拠を示せない、反証を解消できない、必要な文脈を保持できない。自己申告の自信だけで継続を決めない。 -- 昇格先は未解決部分に必要な最小のモデルを選ぶ。単なるツール障害、権限不足、ログイン待ち、情報源の欠落は上位モデルだけで解決しないので、必要な環境対応・情報確認として扱う。 +権限・接続・ログイン・資料不足は能力不足と区別する。必要な委譲をホストの指示や機能が許さなければ、実施可能な部分と未解決点を報告し、別CLI等で迂回しない。子は親へ返すのを既定とし、Chatへの再委譲はしない。 -### 軽い子への委譲と引継ぎ +### 専門工程の委譲と引継ぎ -- 上位モデルで方針・原因・対象範囲・受入条件が確定し、残りが定型調査や実装になったら、委譲条件を満たす範囲をLuna/Terra等の子へ任せる。Astraが親ならその親を維持し、方針の整合・重要レビュー・最終判断を担当する。 +- 通常工程は親で完結し、専門工程を必要な担当へまとめて渡す。親の選択は維持し、重要な専門判断は担当の根拠・前提・反例・未解決点を確認して受け入れる。元の依頼と重要制約を保持し、誤った要約や分割を子が訂正できるようにする。 - 再読込み・説明・レビューの負担が節約を上回る短い残作業は現在のモデルで完了してよい。新しい根拠なしにモデルを往復させない。 - 別コンテキストへ実際に委譲する時、目的、決定事項と理由、対象ファイル/URL/branch・worktree、確認済み根拠と未解決点、受入条件・検証方法、既存の承認範囲、親へ戻す条件を必要十分に渡す。既知のOS・権限・sandbox等の制約と、利用可能な検証環境も短く添える。秘密値は含めない。 - repo作業の引継ぎには絶対cwd、期待するrepo/worktree・branch・HEAD、対象ファイルの未commit差分の有無と識別を既知の範囲で添える。子は最初から指定cwdを明示して、対象repoの場所・branch/HEAD・statusを確認し、既知の差分と照合してから探索・検証・編集する。detached HEADは期待値と一致すれば問題ない。指定先が存在しない、または予期しない不一致が残る場合は根拠を親へ返し、別worktreeを探し回る、reflogから復元する、checkout/resetで合わせる等へ勝手に広げない。Git外の仕事にGit確認を追加する必要はない。 @@ -124,57 +97,37 @@ ### 作業内で使う推論強度と実行条件 -担当モデルが決まった後、次の8通りで選ぶ。単なる難易度の印象ではなく、前提の確定度・必要な判断・検証範囲で区別する。具体的な業務は `model-routing-catalog.md` の対応行へ当てる。 +モデルは担当能力と必要ツールから先に選び、子のeffortは有効なdefault_effortを明示する。既定はLuna/max、Sol/high、Astra/high。Terra/xhighは親の基準と互換定義で、Terra子は標準ルート外。実際の親設定は変更しない。 -| モデル | effort | 選ぶ作業・条件 | -| --- | --- | --- | -| Luna | `xhigh` | 検証済みコマンド、件数・hash・CI状態の照合。対象・手順・期待結果が固定、機械照合でき、解釈不要で低影響 | -| Luna | `max`(標準) | 指定資料抽出、既知パターン探索、一意の局所修正。照合・取り違え防止に注意が必要 | -| Terra | `high` | 原因と修正方針が確定した小変更、既定条件の限定比較。未知の依存や例外が少ない | -| Terra | `xhigh`(標準) | 通常の調査・実装・検証工程、原本の網羅確認、日付の意味、曖昧な分類、欠測の解釈 | -| Terra | `max` | 設計・担当範囲が確定し、多数の境界条件や組合せを深く詰める必要がある | -| Sol | `medium` | Solの理解力を要する限定調査・レビュー。論点・対象・合格条件が明確で、広い探索を伴わない | -| Sol | `high`(標準) | 複数モジュール整合、難しい不具合、互換性修正、矛盾する証拠の整理、重要レビュー | -| Sol | `xhigh` | 設計前提の再検討、複雑な因果関係、難しい反証・競合条件を伴う調査 | - -- Terra/maxは確定した範囲の中を深く詰める仕事、Sol/highは何が問題か・どの前提が正しいか自体を判断する仕事。Sol/xhighはその判断に難しい反証や設計上の対立がある場合。単なる項目数や作業時間では上げず、重大判断・承認は親へ返す。 -- Luna/maxでも担当外の意味・設計判断は行わない。effortを上げてもモデルの能力を同等化できるとはみなさない。難しさの種類が変わったらモデルを先に再評価し、同じ担当の範囲内で必要な深さだけが変われば許容範囲内でeffortを選び直す。安い順・弱い順の試行を義務にしない。 -- highの用途を残すためだけに通常工程を細分化しない。Sol/mediumもSolの理解力が必要な限定作業の候補であり、Terraや既存担当で終わる短い仕事を新しいSolへ渡す理由にしない。 -- Astraの子は既存の重要判断・独立レビューの条件に限り、highを基点に難しい前提・反証ならxhigh、分割しにくい最難問ならmaxを選ぶ。親Astraの設定はこの選定表の対象外。別Astraに同じ判断を重複させない。 -- モデル名・対応effortは実行時の機能で確認する。Astra = gpt-6-astra、Sol = gpt-5.6-sol、Terra = gpt-5.6-terra、Luna = gpt-5.6-luna。利用不可なら承認内の適切な担当か親で進め、必要な能力・確認を満たせなければ未解決点を報告する。 -- low・none・minimal・Ultraは自動選定しない。親が選択したUltra等は維持する。指定できないeffortを使用済みとせず、子の再開でも要求値と観測値を分ける。料金・速度・利用枠の削減は未測定で、API単価をCodex契約の消費率として扱わない。 -- この表は許可済み作業内のサブエージェント選定に適用する。親設定・別タスク・プラグイン・追加購入・本番操作等の承認範囲を広げず、上位指示・利用可能機能を優先する。 - -### 親会話の選択と作業内の委譲 - -- 親の選択はユーザー、許可済み作業内の子の選択はAIが担当する。品質を維持しつつ利用負担を下げる見込みがある範囲を、適切なモデル・effortの子へ積極的に任せる。毎回の起動・再配分の確認は取り直さない。ユーザーが子も含めてモデルや委譲の範囲を明示した場合はそれを守る。 -- 子は親が行うはずだった作業を代替する。親は必要な判断・未解決点・結果の確認と統合を担う。親が既に持つ方針判断を既定で別のAstraへ重複委譲しない。Sol/Astraの子は、独立した重要レビュー等で追加価値がある場合に限る。 -- 標準のサブエージェント機能でモデル/effortを明示する。親の保存設定・実行時のユーザー選択・service_tierは変更しない。過去の導入時の設定を現在値とみなさない。この分担設定の適用を理由に、追加プラグイン、専用エージェント定義、一律Lunaのグローバル既定値、外部有料サービスを導入しない。 -- サブエージェントはUltra専用ではない。通常のeffortでも適用される指示・対応機能に従って利用する。Ultraを節約の前提条件にせず、選んだだけで子が軽いモデルになるとは仮定しない。利用できなければ親で可能な作業を続け、別モデルで実行できたと主張しない。 - -### 時間より利用負担を優先する進行・階層委譲 - -- 既定は親から担当へ1段で、まとまった工程を同じ担当が進める。細かな確認ごとにAstraへ戻す、親子が同じ資料を再読する、作業ごとに新しい子を起動する負担を避ける。既に文脈を持つ担当で終えられる短い残作業はその担当に残す。 -- Astraが親なら、最初に目的・設計・許容範囲・受入条件・戻す条件を決める。方針が固まった複数手順の通常工程はTerra/xhighへ実装と進行をまとめて任せてよい。原本の網羅確認や例外の解釈もxhighを標準とし、high/maxは対応表の具体的な条件に合う場合だけ選ぶ。Terraは範囲内の手順選択、修正、検証、証拠整理まで行い、親は独立した重要な前提・影響の確認と、最後の重要根拠・差分・受入判断に集中する。設計変更・承認境界・重大な問題が出た時は途中でも親へ戻す。「最初と最後だけ」を安全性や受入確認の省略条件にしない。 -- 引継ぎでは既存の承認範囲内の「取得・処理→依頼された成果物の保存→必要な検証→結果報告」を完了単位として示す。中間成果や件数の節目だけで止めず、子は許可済みの後続処理を同じ担当で続ける。途中経過を完了扱いにせず、真の制約・承認境界・親へ戻す条件がある時は完了分と残り・阻害理由を返す。新しい承認を必要としない続行確認を繰り返さない。 -- 必要なブラウザ・ファイル・ツールをその子が使えるか着手時に最小限確認する。利用不能なら既存の許可と利用可能な範囲で代替し、解消できなければ制約を親へ返す。未依頼の既存ブラウザプロファイル操作へ広げない。複数行や複雑な引用を扱う処理は作業領域のスクリプトに保存して実行し、シェル間の文字展開を重ねない。保存・検証済みの中間成果を再利用し、引用エラーだけで原本取得からやり直さない。 -- 単一のLuna仕事だけなら親からLunaへ直接渡す。Terraが通常実装や統合も担い、さらに分離できるまとまった機械的取得・検証がある時だけ、親はTerraにLunaへの再委譲を明示できる。目的、許可する工程、model/effort条件、書込み対象、終了・返却条件を渡す。単なる伝言係や節約の実証だけの階層は作らない。 -- 階層の上限は親→Terra→Lunaの2段(親を含む3層)。これは運用上の上限であり、機能が保証する上限ではない。孫Lunaは再委譲しない。TerraがSol/Astraによる判断を必要とする時は親へ返し、ルートAstraと同じ判断を別のAstraへ重複させない。 -- 直接の子は同時に原則1体。上記の階層ではTerra1体とそのLuna1体までを目安に、各層が別の有用な仕事を担当する。2体以上の兄弟を同時に動かすのは、実際の独立性と全体の重複削減に理由がある場合だけで、時間短縮や空き枠だけを理由にしない。処理順を直列にしただけで総トークンが減るとはみなさない。 -- 起動には、その時の上位指示と機能が優先する。作者の既定運用では、子の仕事が具体的・限定的・独立であり、直接の親にも並行して進められる有用な仕事が必要。この条件はTerraからLunaを起動する時にも適用する。親が待つだけの純粋な直列委譲はこの条件下では起動しない。要件を満たすために不要なレビュー・調査を作らず、親または既存の担当で完了する。別タスク、CLI多重起動、プラグイン等で制約を迂回しない。 -- 待機が可能な段階では結果待ちを使い、頻繁な状態取得・同じ進捗の再報告・先回りした再実装を避ける。ユーザーへの必要な進捗連絡と追加指示への対応は維持する。 -- 公式資料でも、子には独自のモデル・ツール処理と追加トークンがある。階層化は常に安くなる仕組みではない。最小限の引継ぎ、同じ担当の継続、既存結果の再利用を先に行い、親の実作業を十分に代替できる場合に使う。[標準サブエージェント](https://learn.chatgpt.com/docs/agent-configuration/subagents)、[effortとUltra](https://learn.chatgpt.com/docs/models?surface=app)(2026-09-14確認)。子による再委譲の可否は実行時のツール仕様・上位指示で確認し、未実行の階層を検証済みと扱わない。 +モデルIDはLuna=gpt-5.6-luna、Terra=gpt-5.6-terra、Sol=gpt-5.6-sol、Astra=gpt-6-astra。通常ChatはUIの6 Proを選び、Codex effortへ換算しない。要求した設定と実際の観測を分ける。API単価をCodex契約の消費率へ代入しない。 + +子の推論・検証を十分に使い、通常の修正も同じ担当で完結する。品質不足を親の全面的な再処理で隠さず、入力・環境・担当の問題を分けて戻す。設定統一のために実行中の子を止めたり、完了済みの仕事を再実行したりしない。 + +### 親会話の選択と専門判断 + +親の選択は利用者、承認済み工程内の担当選定はAIが行う。基準運用の親Terraは受付専用ではなく、通常の調査・実装・検証・進行を直接行う。別モデル親を選んだ場合も設定は維持する。 + +親は進行と結果の取りまとめを担うが、すべての専門判断を独力で再証明する役ではない。専門担当の根拠・前提・反例・検証結果を合格条件と照合する。自己申告だけで承認せず、矛盾・重大な未解決点は担当へ返す。必要な人の承認を代替しない。 + +標準サブエージェントの実行時機能を確認し、model/effortを明示する。親の保存設定・service_tier・フック信頼・認証を変更しない。追加プラグイン、モデルAPI、別CLIセッションで能力や制約を迂回しない。 + +### 並列分担と直列の専門委譲 + +既定は親から担当へ1段、同時に委譲する工程はChatを含め原則1件。通常のTerra向け工程は親で完結し、Terra子を標準にしない。既存の他モデル親やoverrideを保持し、必要な能力に合わせる。大きな文脈分離のためのTerra子は将来の明示例外候補で、初期比較に混ぜない。 + +並列分担では、子の工程が独立し、親にも別の有用な作業が必要。直列の専門委譲では、必要な判断能力や別の利用環境による追加価値、まとまった合格条件、引継ぎの妥当性を示し、ホストの上位指示・機能が直列委譲を許すことを確認する。許可不明は許可済みにしない。上位指示が親の独立作業を必須にする場合はその条件を優先し、架空の親作業や別CLIで迂回しない。 + +子へは取得・処理/実装・承認済み通常修正・検証・証拠整理・報告までを完了単位として渡す。親は委譲した探索・実装を先回りしない。独立作業が完了したら適切に待機し、頻繁な状態取得や進捗再報告を増やさない。必要なユーザーへの連絡は維持する。 + +子からの再委譲は標準にせず親へ返す。Chatはrootだけから利用し、深い階層や伝言係を作らない。単純に直列化・階層化したことを節約の証拠としない。 ### 子への割当てと節約の条件 -担当の具体例は `model-routing-catalog.md` を使い、この節では引継ぎと親の作業量を決める。短い確認は現在の担当で終え、起動・階層の条件は前節に従う。 +節約は「子の消費が小さい」ことではなく、親から減らせた処理が、子の処理・引継ぎ・追加検収・手戻りを上回るかで判断する。子のeffortはまず固定し、開始モデル・担当範囲・Chatへの分類による差を比較する。小さな工程を移して親子双方の説明や再読を増やさない。 + +有効な6 Pro経路は適合工程の主要担当として使い、最後の確認だけに温存しない。一方、利用率・メッセージ消化を目標にせず、同じ分析をAstraで全面的にやり直さない。高影響、矛盾、前提変更、証拠不足に追加レビューを絞る。 -1. **割当てに必要なところまで調べたら渡す。** 目的・対象・制約・成果物・合格条件が示せ、親の独立した有用な仕事もある時点で委譲する。実装箇所や手順を全部特定するまで親が探索しない。計画に必要な情報の選別を伴う調査はTerra以上に任せられるが、曖昧さの解釈や重大な設計判断は親が担う。Lunaへの抽出依頼へ意味の選別を紛れ込ませない。 -2. **子が代替する工程と、親に残す論点を決める。** 起動時に一文ずつ示せばよく、別の計画書は不要。子には承認済みの調査・実装・必要な検証・報告までをまとめる。親は同じファイルの探索・実装を先回りせず、独立した重要な前提を確認する。それが終わったら結果待ちへ進み、待ち時間を埋めるための作業を増やさない。 -3. **説明と手直しを含めて担当を選ぶ。** Lunaに渡すためだけに親が解法をほぼ完成させる必要があるなら、通常の判断を含む工程はTerra、複雑な矛盾・互換性の解消を含む工程はSolを第一候補とする。既知の同種作業で親の細かな指示や修正往復が膨らんだ場合も、未着手分から見直す。全モデルを安い順に試す必要はない。モデル別の下限・標準・上限と、対応表の具体的な条件を守る。 -4. **同じ仕事は同じ担当へ続けて渡す。** 完了後の修正・追加検証も、担当能力・文脈・再開機能が適合する既存の子を優先し、追加指示は変更要求・新しい根拠・合格条件の差分に絞る。設定の要求値と観測値を区別し、再開時のmodel/effortを確認できなければ不明とする。指定や必要な実行条件を満たせない、再開不能、文脈喪失、能力・範囲変更の場合は、未完了分と既存成果だけを引き継ぐ。キャッシュ維持は機能次第で保証しない。キャッシュ目的の定期呼出しや無関係な仕事の詰込みは行わない。 -5. **親の受入を重要差分と不足へ絞る。** 子の結論だけで合格にせず、受入条件と重要差分・影響・検証根拠を照合する。対象revision・未commit差分・環境が合う既存の合格結果は再利用し、追加確認は関連変更・失敗・矛盾・証拠不足・必須チェックの欠落がある部分に限る。軽微な修正依頼は可能な範囲でまとめて同じ担当へ返す。子の適切な実装を親の好みだけで書き換えて再検証を増やさない。本番・マージの承認と重要レビューは省略しない。 -6. **報告と回復を短くする。** 結論、変更、検証結果への参照、未解決点を返し、全ログ・全履歴・秘密値を貼り戻さない。具体的修正後も同じ問題が残る、情報が増えない、前提や承認範囲が変わる場合は、既存成果を保って親へ返す。権限・ログイン・ツール障害はモデル変更で解決すると扱わず、条件不変の再試行や委譲連鎖を作らない。 +同程度の仕事・同じ合格条件で、Astra親の従来構成とTerra親の新構成を比較する。短い通常仕事はTerra単独も基準にする。Codex親子合計・Chatメッセージ・追加クレジット・品質・人の修正を分ける。モデルの割合は絶対量の削減の証拠ではなく、取得不能な使用量は理由付き不明とする。測定だけの追加仕事は作らない。 ### 利用負担の観測 diff --git a/tests/test_chatgpt_hook.py b/tests/test_chatgpt_hook.py index 7cce286..1843c0f 100644 --- a/tests/test_chatgpt_hook.py +++ b/tests/test_chatgpt_hook.py @@ -46,7 +46,10 @@ def test_enabled_only_advertised_to_session_root(self): self.assertIn("Temporary Chat", parent) self.assertIn("evaluate this Chat route first", parent) self.assertIn("verified tools", parent) - self.assertIn("parent must still have useful independent work", parent) + self.assertIn("Parallel delegation requires useful independent parent work", parent) + self.assertIn("Serial specialist delegation requires explicit host permission", parent) + self.assertIn("implementation/testing/PR", parent) + self.assertIn("unknown authorization blocks dispatch", parent) self.assertIn("never use send_message_to_thread", parent) self.assertIn("never Work or a model API", parent) self.assertLessEqual(len(parent), routing.MAX_ADDITIONAL_CONTEXT_CHARS) diff --git a/tests/test_fixed_routing.py b/tests/test_fixed_routing.py new file mode 100644 index 0000000..29977ad --- /dev/null +++ b/tests/test_fixed_routing.py @@ -0,0 +1,174 @@ +"""Policy/dispatch regressions: no calls to models, accounts or external services.""" +import copy +from datetime import datetime, timedelta, timezone +import importlib.util +import io +import json +from pathlib import Path +import sys +import tempfile +import unittest +from contextlib import redirect_stdout, redirect_stderr + +ROOT = Path(__file__).resolve().parents[1] +SCRIPTS = ROOT / 'plugins/codex-task-routing/scripts' +sys.path.insert(0, str(SCRIPTS)) +import chat_plan as cp +import chatgpt_route as route +import routing + + +class FixedRoutingTests(unittest.TestCase): + def setUp(self): + root = ROOT / 'tests/.tmp-runtime-tests' + root.mkdir(exist_ok=True) + self.temp = tempfile.TemporaryDirectory(dir=root) + self.addCleanup(self.temp.cleanup) + self.home = Path(self.temp.name) + self.now = datetime(2026, 9, 15, 12, tzinfo=timezone.utc) + self.facts = dict(substantial=True, parent_has_independent_work=False, + materials_approved=True, handoff_proportionate=True, + requires_repeated_local_access=False, needs=[]) + self.serial = dict(mode='serial_specialist', host_allows_serial=True, + reason='Specialist reasoning on complete approved materials.') + self.live = dict(is_root=True, route_enabled=True, surface='chat-temporary', + model='6 Pro', transport='browser-temporary', transport_authorized=True, + actions_authorized=True, quota_state='no_limit_notice', + observed_at=self.now.isoformat()) + + def plan(self, **changes): + return cp.plan({**self.facts, 'delegation': self.serial}, now=self.now, + live={**self.live, **changes}) + + def test_legacy_parallel_and_explicit_serial_are_distinct(self): + self.assertEqual(cp.plan(self.facts)['route'], 'codex') + self.assertEqual(self.plan()['route'], 'chat_candidate') + self.assertTrue(self.plan()['live_checked']) + self.serial['host_allows_serial'] = False + self.assertEqual(self.plan()['reason'], 'host_does_not_allow_serial_delegation') + self.facts['parent_has_independent_work'] = True + self.assertEqual(self.plan()['route'], 'codex') + + def test_bad_serial_declarations_do_not_create_permission(self): + for value in (None, {}, {'mode': 'parallel'}, + {**self.serial, 'host_allows_serial': 'true'}, + {**self.serial, 'reason': ''}, {**self.serial, 'extra': True}): + with self.subTest(value=value), self.assertRaises(cp.ChatRouteError): + cp.plan({**self.facts, 'delegation': value}) + + def test_each_permission_gate_blocks_independently(self): + for field in ('is_root', 'route_enabled', 'transport_authorized', 'actions_authorized'): + with self.subTest(field=field): + self.assertEqual(self.plan(**{field: False})['route'], 'not_ready') + with self.assertRaises(cp.ChatRouteError): + self.plan(**{field: 'true'}) + + def test_no_work_api_or_silent_model_fallback(self): + for fields in ({'surface': 'work'}, {'surface': 'chat'}, {'transport': 'api'}, + {'model': 'GPT-5.6 Thinking Medium'}, {'model': 'unknown'}, {'model': 'Sol Pro'}): + with self.subTest(fields=fields): + self.assertEqual(self.plan(**fields)['route'], 'not_ready') + + def test_quota_and_snapshot_freshness(self): + self.assertEqual(self.plan(quota_state='exhausted')['route'], 'not_ready') + self.assertEqual(self.plan(quota_state='unknown')['route'], 'preflight_needed') + for seconds in (-121, 1): + observed = self.now + timedelta(seconds=seconds) + self.assertEqual(self.plan(observed_at=observed.isoformat())['route'], 'preflight_needed') + self.assertEqual(self.plan(observed_at=(self.now-timedelta(seconds=120)).isoformat())['route'], 'chat_candidate') + with self.assertRaises(cp.ChatRouteError): + self.plan(quota_state='unlimited') + + def test_live_does_not_override_short_unapproved_or_local_work(self): + for field, value in [('substantial', False), ('handoff_proportionate', False), + ('materials_approved', False), ('requires_repeated_local_access', True)]: + original = self.facts[field] + self.facts[field] = value + self.assertNotEqual(self.plan()['route'], 'chat_candidate') + self.facts[field] = original + + def test_read_scope_does_not_grant_write_or_cross_surface_capabilities(self): + read = dict(tool='GitHub', operation='fetch_file', scope='example/project') + inventory = dict(schema_version=1, surface='chat-temporary', model='6 Pro', + installed_plugins=['GitHub'], capabilities=[dict( + **read, state='verified', observed_at=self.now.isoformat(), + expires_at=(self.now+timedelta(days=1)).isoformat())]) + facts = {**self.facts, 'delegation': self.serial, 'needs': [{**read, 'operation': 'update_file'}]} + self.assertEqual(cp.plan(facts, inventory, now=self.now, live=self.live)['route'], 'preflight_needed') + facts['needs'] = [read] + legacy_live = {**self.live, 'surface': 'chat', 'transport': 'codex-app-tools'} + self.assertEqual(cp.plan(facts, inventory, now=self.now, live=legacy_live)['reason'], 'capability_surface_mismatch') + inventory['surface'] = 'chat' + self.assertEqual(cp.plan(facts, inventory, now=self.now, live=legacy_live)['route'], 'chat_candidate') + + def test_cli_preserves_inputs_and_marks_old_call_unchecked(self): + facts = {**self.facts, 'delegation': self.serial} + paths = [self.home/'facts.json', self.home/'live.json'] + for path, data in zip(paths, (facts, self.live)): + path.write_text(json.dumps(data), encoding='utf-8') + before = [p.read_bytes() for p in paths] + with redirect_stdout(io.StringIO()) as output: + self.assertEqual(cp.main(['--facts', str(paths[0])]), 0) + self.assertFalse(json.loads(output.getvalue())['live_checked']) + # An exhausted current observation must block irrespective of its time. + paths[1].write_text(json.dumps({**self.live, 'quota_state': 'exhausted'}), encoding='utf-8') + before[1] = paths[1].read_bytes() + with redirect_stdout(io.StringIO()) as output: + self.assertEqual(cp.main(['--facts', str(paths[0]), '--live', str(paths[1])]), 0) + self.assertEqual(json.loads(output.getvalue())['route'], 'not_ready') + self.assertEqual(before, [p.read_bytes() for p in paths]) + + def test_fixed_defaults_and_child_hook_have_no_normal_terra_child(self): + policy = routing.load_policy(codex_home=self.home) + self.assertEqual({k:v['default_effort'] for k,v in policy.config['models'].items()}, + dict(luna='max', terra='xhigh', sol='high', astra='high')) + effective = policy.render_template(policy.templates['effective.md']) + self.assertIn('Terra子は標準ルートから外し', effective) + for name, text in policy.templates.items(): + self.assertNotIn('.min_effort}}', text) + self.assertNotIn('.max_effort}}', text) + child = routing.hook_payload(event='SubagentStart', source='startup', codex_home=self.home, cwd=self.home) + context = child['hookSpecificOutput']['additionalContext'] + self.assertNotIn('Terra=gpt-', context) + self.assertIn('Luna=gpt-5.6-luna (max)', context) + self.assertIn('Terra child is outside the standard route', context) + + def test_existing_partial_override_is_not_deleted_or_rejected(self): + path = self.home/'codex-task-routing/overrides.json' + path.parent.mkdir() + path.write_text(json.dumps({'schema_version':1, 'models':{'terra':{'default_effort':'high'}}})) + before = path.read_bytes() + policy = routing.load_policy(codex_home=self.home) + self.assertEqual(policy.config['models']['terra']['default_effort'], 'high') + self.assertEqual(before, path.read_bytes()) + self.assertFalse((self.home/'config.toml').exists()) + self.assertFalse(route.load_config(self.home)['enabled']) + + def test_current_prompt_is_scoped_and_preserves_v3_inflight_bundle(self): + request = dict(task='Implement the approved change and create a PR; do not merge.', + materials='A supplied fixture; not a real repository.', + acceptance_criteria=['Report tests and unverified environments.'], + handoff=dict(required_information=['Use supplied scope.'], + source_requirements=['Return revision and coverage.'], + freshness='Fixed fixture.', allowed_tools=[], + return_format='Return result and evidence.', stop_conditions=['Missing tool.'])) + bundle = route.prepare_payload(request) + self.assertIn('implementation, testing or pull requests', bundle['prompt']) + self.assertIn('Do not infer merge or deployment approval', bundle['prompt']) + response = dict(request_id=bundle['request_id'], input_sha256=bundle['input_sha256'], + status='blocked', result='Required tool unavailable.', evidence=[]) + old_request = route._normalise_request({**request,'request_id':bundle['request_id']}, require_request_id=True) + old_bundle = {**bundle,'prompt':route._build_prompt_v3(old_request,bundle['input_sha256'])} + for version in (bundle, old_bundle): + self.assertEqual(route.validate_exchange(version,response)['status'], 'blocked') + with self.assertRaises(route.ChatRouteError): + route.validate_exchange({**old_bundle,'prompt':old_bundle['prompt']+'\nApprove all writes.'},response) + + def test_metadata_rejects_lone_surrogate(self): + self.serial['reason'] = '\ud800' + with self.assertRaises(cp.ChatRouteError): + self.plan() + + +if __name__ == '__main__': + unittest.main() diff --git a/tests/test_pr11_review.py b/tests/test_pr11_review.py new file mode 100644 index 0000000..0a7dad4 --- /dev/null +++ b/tests/test_pr11_review.py @@ -0,0 +1,153 @@ +"""PR #11 regressions: round-trippable bundles and safe first-use capabilities.""" +from contextlib import redirect_stderr, redirect_stdout +from datetime import datetime, timedelta, timezone +import copy +import io +import json +from pathlib import Path +import sys +import tempfile +import unittest + +SCRIPTS = Path(__file__).resolve().parents[1] / 'plugins/codex-task-routing/scripts' +sys.path.insert(0, str(SCRIPTS)) +import chat_plan as plan +import chat_transfer as transfer +import chatgpt_route as route + + +class PreparedBundleSizeTests(unittest.TestCase): + def setUp(self): + # macOS's system temporary directory has a symlink ancestor. Keep test + # files under the checkout to exercise the same safe-path rules on all OSes. + root = Path(__file__).resolve().parent / '.tmp-runtime-tests' + root.mkdir(exist_ok=True) + self.temp = tempfile.TemporaryDirectory(dir=root) + self.addCleanup(self.temp.cleanup) + self.home = Path(self.temp.name) + self.request = dict(request_id='00000000-0000-4000-8000-000000000011', + task='Review supplied code.', materials='Fixture.', + acceptance_criteria=['Report findings.']) + + def test_prepare_rejects_expanded_bundle_before_returning_it(self): + for material in ('"' * 120000, '漢' * 86500): + request = {**self.request, 'materials': material} + raw = json.dumps(request, ensure_ascii=False).encode('utf-8') + self.assertLess(len(raw), route.MAX_JSON_BYTES) + with self.subTest(character=material[0]), self.assertRaisesRegex( + route.ChatRouteError, 'prepared bundle exceeds the size limit'): + route.prepare_payload(request) + + def test_cli_rejection_has_no_partial_bundle_or_source_mutation(self): + request = {**self.request, 'materials': '"' * 120000} + path = self.home / 'request.json' + path.write_text(json.dumps(request), encoding='utf-8') + original = path.read_bytes() + output, error = io.StringIO(), io.StringIO() + with redirect_stdout(output), redirect_stderr(error): + status = route.main(['prepare', '--input', str(path)]) + self.assertEqual(status, 2) + self.assertEqual(output.getvalue(), '') + self.assertIn('prepared bundle exceeds the size limit', error.getvalue()) + self.assertEqual(original, path.read_bytes()) + + def test_largest_quote_bundle_roundtrips_through_cli_and_transfer(self): + sample = route.prepare_payload({**self.request, 'materials': '"'}) + serialized_size = len((json.dumps(sample, ensure_ascii=False, sort_keys=True) + '\n').encode('utf-8')) + count = 1 + (route.MAX_JSON_BYTES - serialized_size) // 4 + request = {**self.request, 'materials': '"' * count} + source = self.home / 'request.json' + source.write_text(json.dumps(request), encoding='utf-8') + output = io.StringIO() + with redirect_stdout(output): + self.assertEqual(route.main(['prepare', '--input', str(source)]), 0) + encoded = output.getvalue().encode('utf-8') + self.assertLessEqual(len(encoded), route.MAX_JSON_BYTES) + self.assertLess(route.MAX_JSON_BYTES - len(encoded), 4) + bundle_path = self.home / 'bundle.json' + bundle_path.write_bytes(encoded) + state = transfer.TransferState.from_paths(bundle_path, self.home / 'reply.json') + self.assertEqual(state.request_id, self.request['request_id']) + reply = dict(request_id=state.request_id, input_sha256=state.input_sha256, + status='completed', result='Review complete.', evidence=[]) + self.assertTrue(state.save_response(reply)[1]) + with self.assertRaises(route.ChatRouteError): + route.prepare_payload({**request, 'materials': '"' * (count + 1)}) + + +class FirstUseCapabilityTests(unittest.TestCase): + def setUp(self): + self.now = datetime(2026, 9, 15, 12, tzinfo=timezone.utc) + self.need = dict(tool='GitHub', operation='create_pull_request', scope='example/project') + self.capability = dict(**self.need, state='permission_checked', + permission_evidence='Fixture: operation schema and repository push permission checked; no trial write.', + observed_at=self.now.isoformat(), + expires_at=(self.now + timedelta(days=1)).isoformat()) + self.inventory = dict(schema_version=1, surface='chat-temporary', model='6 Pro', + installed_plugins=['GitHub'], capabilities=[self.capability]) + self.facts = dict(substantial=True, parent_has_independent_work=True, + materials_approved=True, handoff_proportionate=True, + requires_repeated_local_access=False, needs=[self.need]) + self.live = dict(is_root=True, route_enabled=True, surface='chat-temporary', model='6 Pro', + transport='browser-temporary', transport_authorized=True, + actions_authorized=True, quota_state='no_limit_notice', + observed_at=self.now.isoformat()) + + def evaluate(self, **changes): + return plan.plan(self.facts, self.inventory, now=self.now, + live={**self.live, **changes}) + + def test_first_authorized_operation_is_not_claimed_executed(self): + before = copy.deepcopy(self.inventory) + result = self.evaluate() + self.assertEqual(result['route'], 'chat_candidate') + self.assertTrue(result['live_checked']) + self.assertEqual(result['checks'][0]['state'], 'permission_checked') + self.assertFalse(result['checks'][0]['execution_verified']) + self.assertEqual(self.inventory, before) + + def test_permission_check_requires_scoped_evidence(self): + for evidence in (None, '', 'x' * 513, '\ud800', False): + cap = dict(self.capability) + if evidence is None: + del cap['permission_evidence'] + else: + cap['permission_evidence'] = evidence + with self.subTest(evidence=repr(evidence)), self.assertRaises(route.ChatRouteError): + plan.validate_inventory({**self.inventory, 'capabilities': [cap]}) + + def test_no_fresh_live_check_means_no_first_use_candidate(self): + result = plan.plan(self.facts, self.inventory, now=self.now) + self.assertEqual(result['route'], 'preflight_needed') + for changes in ({'actions_authorized': False}, {'transport_authorized': False}, + {'is_root': False}, {'route_enabled': False}, {'model': 'other'}, + {'quota_state': 'exhausted'}, {'quota_state': 'unknown'}, + {'observed_at': (self.now - timedelta(minutes=3)).isoformat()}): + with self.subTest(changes=changes): + self.assertNotEqual(self.evaluate(**changes)['route'], 'chat_candidate') + + def test_advertised_and_executed_states_remain_distinct(self): + self.capability['state'] = 'advertised' + self.assertEqual(self.evaluate()['route'], 'preflight_needed') + self.capability['state'] = 'verified' + result = self.evaluate() + self.assertEqual(result['route'], 'chat_candidate') + self.assertTrue(result['checks'][0]['execution_verified']) + self.capability['state'] = 'blocked' + self.assertEqual(self.evaluate()['route'], 'not_ready') + + def test_first_use_cannot_cross_operation_scope_surface_or_expiry(self): + for key, value in [('operation', 'merge_pull_request'), ('scope', 'other/project')]: + self.facts['needs'] = [{**self.need, key: value}] + with self.subTest(key=key): + self.assertEqual(self.evaluate()['route'], 'preflight_needed') + self.facts['needs'] = [self.need] + self.assertEqual(self.evaluate(surface='chat', transport='codex-app-tools')['reason'], + 'capability_surface_mismatch') + self.capability['expires_at'] = self.now.isoformat() + self.capability['observed_at'] = (self.now - timedelta(hours=1)).isoformat() + self.assertEqual(self.evaluate()['route'], 'preflight_needed') + + +if __name__ == '__main__': + unittest.main()