# システムプロンプトのテンプレート化 ## 背景 現状、`WorkerManifest.system_prompt` は単なる `Option` で、マニフェスト記述時点の固定テキストしか持てない。実行時に決まる情報(日付、cwd、scope、利用可能なツール、外部ファイルの内容など)をシステムプロンプトに埋め込む手段が無く、Pod ごとに文脈を調整したいケースに対応できない。 AGENTS.md の取り込みをはじめ、今後システムプロンプトへ差し込みたい情報は増えていく見込みで、その受け皿としてテンプレート機構を先に固める。 ## 要件 ### 評価モデル - ツールファクトリと同じく**遅延評価**。マニフェストの値はテンプレート定義として保持し、文字列への materialize は Pod がワーカーを起動して**最初のターンが開始されるタイミングで1回だけ**行う。 - 一度 materialize したシステムプロンプトは以降のターンを通じて同一値を使う。**compact 後も再評価しない**(compact の前後でシステムプロンプトが変化しないことを保証する)。 ### テンプレート構文と変数 - プレースホルダ構文を1つ決める(既存エンジン採用 or 最小独自記法)。選定理由を背景に書き残す。 - 組み込み変数のセットを定義する。初期セットの候補: - 日付 / 時刻 - Pod の cwd - scope 情報(読み取り可能パス等の要約) - 利用可能なツール一覧 - AGENTS.md 等の外部ファイル(別チケットで値を供給する前提で、キー空間だけ確保する) - 未定義変数を参照したときの挙動(エラー / 空文字 / 警告ログ)と、リテラルとして `{{` を出したい場合のエスケープ方法を定める。 ### マニフェスト上の記法 - 既存フィールド `system_prompt` をそのままテンプレート文字列として解釈するか、テンプレート用フィールドを新設するかを決める。 - マニフェストのパース段階ではテンプレートの構文検査のみ行い、変数解決は行わない(遅延評価の原則を崩さない)。 ### エラー処理 - テンプレート展開時のエラー(未定義変数・構文エラー・外部入力の失敗)が first turn 開始時に起きた場合の扱いを決める。ワーカー起動失敗として扱うか、フォールバックで進めるか。 ## 完了条件 - マニフェストに書いたシステムプロンプトがテンプレートとして解釈され、少なくとも組み込み変数の数種類(例: 日付、cwd)が first turn 開始時に展開されて LLM への system メッセージに反映される。 - compact を挟んでもシステムプロンプトが再評価されないことをテストで担保する。 - 外部ファイル系の変数(AGENTS.md など)は別チケットで供給するため、本チケットでは「変数として受け取れる器」までを用意する。 ## 範囲外 - AGENTS.md の読み取り自体は別チケット(`agents-md-ingestion.md`)で扱う。 - ユーザ単位の共通設定ファイル(Insomnia 独自の user config)は本チケットのスコープ外。