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 種に分かれる。

  1. 役 — 実装委譲の役 literal。Claude Code では定義ファイルが役を持たないため、プロンプトが唯一の経路。
  2. ゲート状態の判断 — trigger モードの auto-merge 有効化と停止条件のポインタ、再開点の権限境界(resume-prompt-injection-list-closed-by-criterion)。
  3. ツール権限の境界 — 再帰 spawn の禁止、git stash の代わりの退避手順。
  4. 親側にしか無い状態 — 言語の解決値(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.md Constraint: 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

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 へ移した組み直し