delegation prompt carries bounds not procedure - Liplus-Project/liplus-language GitHub Wiki
委譲プロンプトが運ぶのは境界と親側の状態であって、手順ではない
Question
skills/task-subagent-delegation/SKILL.md Rules は委譲プロンプトに「手順の詳細・ブランチ名・コミットメッセージ・意図」を伝えないと定める。一方で skills/task-subagent-prompt/SKILL.md は、役 literal、trigger モードの 2 項目、再帰 spawn の禁止、退避手順、言語の解決値、memory の literal を注入させる。これらは規則の例外なのか。何が注入を許すのか。
Current resolution
例外ではない。注入してよいのは、サブエージェント側が自分の情報源からは決められないものだけである。 「伝えない」の列挙 4 項目(手順・ブランチ名・コミットメッセージ・意図)を貫く軸は手順の長さではなく、サブエージェントが auto-load する rules / skills や issue body から既に決定できることである。注入対象はその裏返しで、次の 4 種に分かれる。
- 役 — 実装委譲の役 literal。Claude Code では定義ファイルが役を持たないため、プロンプトが唯一の経路。
- ゲート状態の判断 — trigger モードの auto-merge 有効化と停止条件のポインタ、再開点の権限境界(
resume-prompt-injection-list-closed-by-criterion)。 - ツール権限の境界 — 再帰 spawn の禁止、
git stashの代わりの退避手順。 - 親側にしか無い状態 — 言語の解決値(session-start hook の出力はサブエージェントへ届かない)、memory の literal(memory は auto-load されない)。
各項目の本文は skills/task-subagent-prompt/SKILL.md が持つ。ここが持つのは #1615 の組み直しで本文から移した経緯と理由である。
役 literal(#1972 / PR #1975、#1967 / PR #1984)
adapter/claude/agents/を役ごと(implementer.md/brake-evaluator.md/dialogue-evaluator.md)からエフォートごと(low.md/medium.md/high.md)へ組み替えた。役ごとに置くと役の数だけ写しが増えるが、エフォートごとなら 3 本で固定される。旧implementer.mdの本文が担っていた役は、プロンプト側の 1 箇所へ移った。- 「逐語でコピーし、spawn ごとに書き直さない」は、評価者の書き換え禁止 literal(
skills/evolution-parallel-agent-eval/SKILL.mdConstraint: Evaluator does not modify the evaluation target、brake-evaluator-baseline-integrity)と同じ規律である。 - Codex 側(
adapter/codex/agents/*.toml)はこの再編の対象外(Master 合意、2026-09-14)。Codex は spawn 呼び出しでreasoning_effortを渡せるため前提が異なる。effort の固定を TOML から外したのは別 issue(#1973)。 - #1984 以降、役はエフォートも
modelも選ばない。親が spawn ごとに作業に応じて選ぶ(skills/task-subagent-spawn/SKILL.md)。
trigger モードの 2 項目
- (a) auto-merge 有効化の起点は #570(PR 作成フローへの auto-merge 有効化ステップの追加)。trigger モードの PR は既定で auto-merge しないため、これが無いと人間の承認後に PR が止まったまま残る。
- trigger モード注入の項目群は #1178 / PR #1179(memory からの昇格)で「issue URL だけ」の最小パターンに対する trigger 例外として正規化された。サブエージェントが自分で発見する事実ではなく、親側の判断だからである。
- (b) 停止条件をリテラルでなくポインタで運ぶのは #1708 以降(親は operations skill を読めない)。
- body 言語をこのリストに置かない理由(#1580 / PR #1709)。 body 言語は trigger モード固有ではなく全モードで必須であり、ここに置けば普遍項目の写しにしかならない。実際、写し側の旧 (a) 項目は
liplus-language requires Japaneseという解決値を抱えていた(#1580 で是正)。解決値がそこへ沈殿するのが、この写しのドリフトの形である。「リストに無い = trigger モードでは免除」と読む誤読も同じ PR で閉じた。
ツール権限の境界
- 再帰 spawn の禁止(#1528 / PR #1529)。 2026-07-06 の観測: 定時進化タスクの read-only 監査を 3 並列の
general-purposeサブエージェントへ委譲したところ、プロンプトに Bash/Read/Grep で直接実行する手順を書いていたにもかかわらず Agent ツールを禁止していなかったため、3 体すべてが孫を生成し、一部は孫の孫まで生成した。15 件超のバックグラウンド通知、API rate limit 到達、成果物は 3 体中 1 体のみ。各段がコスト増を警告なしに積み、最上位の報告は所見ではなく「バックグラウンドのエージェントを待っている」というコーディネータのメタ発言になった。原因は host 仕様ではなく、プロンプトに禁止が無かったこと。実装委譲エージェントがどちらのポートでもtoolsを名乗らず既定集合を取ることは #1947 / #1972 で確認されている。 - 退避手順(#1803 / PR #1870)。 worktree が分離するのは working tree と index であって、
refs/stashは共有.gitの単一 ref である。2 つの worktree からのgit stash pushは同じスタックに積まれ、どちらのpopも先頭を取り、エラーも警告も出ない。置き換え先のgit stash create+refs/worktree/wipstashについて、git 2.53.0 で独立に再現して 3 点を確認し手順へ反映した(working tree を戻さない / clean tree では空文字を返す / ref は単一スロット)。ref 名を issue 番号で分けないのは、refs/worktree/名前空間が既に worktree ごとに分けているため。無条件注入にしたのは、他の worktree が生きているかを worktree の内側から見られないため。 - 「これは手順ではないか」という争点(PR #1870 brake 1 round 2、却下)。 注入ブロックは条件分岐を含む複数コマンドであり「step-by-step procedure」に当たるという所見に対し、著者は却下した。規則の literal はステップ数や分岐の有無の閾値を固定しておらず、閾値を裁定側で新設することになる。規則自身が供給する判定軸は上記(サブエージェントが自分の情報源から決められるか)であり、共有リポジトリ状態に対する操作の権限境界はそれに当たらない。本文の「tool-authority bound であって手順の伝達ではない」の一文は、この争点への答えとして残している。
親側にしか無い状態
- memory(#1173 / PR #1179)。 「memory にあるからサブエージェントも拾う」という前提は過去のセッションで繰り返し失敗した。memory はサブエージェントの context へ auto-load されない。恒久策は Li+ rules への昇格、プロンプトへの literal 注入はタスクごとの回避策。
- 言語の解決値。
distributed-source-carries-no-resolved-config-valueが持つ。
成果物言語の衛生(#1561 / PR #1622)
旧版は例示テキストを一律 ASCII-only とし、od -c を body にも当てさせていた。根拠は「governance CI は PR タイトルしか検査しないため、typographic 文字が commit body・wiki entry・issue body へ漏れてマージ後に残る」だった。これが commit body / PR body の日本語必須と正面から衝突し、PR #1560 の委譲ではサブエージェントが指示どおりに従えば CI が必ず落ちる衝突を自力で検出して回避した(#1561)。#1622 でタイトルと body を欄ごとの契約に分けた。タイトルは ASCII 英語、body は対象成果物の言語契約で、UTF-8 / mojibake で検証する。
#1615 の組み直しで、本文の Resume (d) が参照していた「Delegation prompt hygiene の (a)」は、衛生節にラベル付きの項目が無い宙づりの参照だった(#1709 で trigger モード側の旧 (a) を削除した名残)。衛生節の 2 項目に (a) タイトル / (b) body のラベルを付け、参照を (b) に揃えた。
Edges
- depends on
implementation-always-delegated— 実装は常に委譲されるため、委譲プロンプトが新しい汚染面になることを同 entry が対価として受容している。本 entry はその面に何を載せてよいかを扱う。 - relates to
distributed-source-carries-no-resolved-config-value— 親側の状態のうち言語の解決値。 - relates to
resume-prompt-injection-list-closed-by-criterion— ゲート状態の判断のうち再開点のもの。 - relates to
subagent-parallel-width-cap— 並列幅(width)は同 entry、再帰 spawn(depth)は本 entry。互いに広げも狭めもしない。
Related
- #1972 / PR #1975、#1967 / PR #1984 — 役 literal の置き場とエフォート選択
- #570、#1178 / PR #1179、#1708 — trigger モードの注入項目
- #1580 / PR #1709 — body 言語をリストから外した判断
- #1528 / PR #1529 — 再帰 spawn の禁止
- #1803 / PR #1870 — worktree 安全な退避手順
- #1561 / PR #1622 — 欄ごとの言語契約
- #1615 — 本文から理由を本 entry へ移した組み直し