コンテンツにスキップ

agent の Skill セットを制限する

目的: agent のルーターが選択できるプロジェクト/stdlib の Skill を制限する。専門化して集中すべき specialist agent や、オープンエンドなツールを呼び出すべきでない本番 agent に有用。

使うべき状況

  • researcher agent は article_writer を呼び出すべきでない。
  • 単一ワークフロー専用の agent が、隣接するツールに誘惑されたり(または幻覚で)入り込むべきでない。
  • 20 の Skill が利用可能な場合にルーター LLM が何を選ぶか不安。

制限しないもの

allowed_skills は以下には影響しません:

  • stdlib システム Skillskill_routerchat_compactor。これらは常に利用可能です。allowed_skills: [] の agent でも chat ができます。(FP-0011 で旧 skill_narrator Skill は削除されました。 Skill 完了の narration は router LLM が inline で行います。)
  • agent 間の委任messages_to_agents は Topology ルールによって管理され、Skill の allowlist によらない。Skill がない agent でも Skill を持つピアに委任できます。
  • Memory アクセス — 共有と agent スコープの両方の Memory レイヤーは読み書き可能です。

レシピ

allowed_skills は agent の profile.yaml に記述します。まだ CLI フラグはありません(残課題)。ファイルを直接編集してください。

1. ファイルを見つける

$EDITOR .reyn/agents/researcher/profile.yaml

2. フィールドを追加する

name: researcher
role: |
  deep technical research, prefers primary sources.
created_at: 2026-05-01T12:00:00+00:00
allowed_skills:
  - web_search
  - recall_docs
  - direct_llm

ファイルを保存します。次の reyn chat researcher が起動時に変更を反映します。

3. 確認する

reyn agent show researcher
name:        researcher
created_at:  2026-05-01T12:00:00+00:00
workspace:   /path/to/project/.reyn/agents/researcher
allowed_skills:
  - web_search
  - recall_docs
  - direct_llm
role:
  deep technical research, prefers primary sources.

3 つの状態

allowed_skills は三値です。各状態は明確な動作を持ちます:

動作
フィールドなし / null 無制限。 すべてのプロジェクト + stdlib Skill がルーター LLM に提供されます。(新規 agent のデフォルト。)
[](空リスト) ルーターのみ。 Skill の起動は行われません。ルーターは直接返信またはピアへの委任はできます。「純粋な会話」agent に有用。
[a, b, c] Allowlist。 それらの Skill 名のみが提供されます。

意図的に会話的な agent の例:

name: lead
role: triages requests and synthesizes worker output.
allowed_skills: []  # Skills を直接起動しない; 常に委任または直接返信

二重レイヤーの強制

  1. ルーター側のフィルター_invoke_router は LLM がカタログを見る前に available_skills を allowlist に絞り込みます。LLM はブロックされた Skill を知ることができません。
  2. 多層防御_spawn_skill は起動時に再チェックします。LLM が幻覚の Skill 名を出力した場合(またはセッション中に allowlist を絞り込んだ場合)、起動はアウトボックスのエラーで拒否されます。

何かが期待通りに実行されないときに確認するのはこの防御パスです。

拒否の観察

LLM が allowlist にない skills_to_run エントリーを出力した場合、アウトボックスには以下が表示されます:

[error] skill 'article_writer' is not in allowed_skills for agent 'researcher'; refused

構造化イベントが events.jsonl に記録されます:

{"type": "skill_spawn_refused", "data": {"reason": "allowlist", "skill": "article_writer", "agent": "researcher"}}

拒否をフィルタリングします:

grep '"skill_spawn_refused"' .reyn/agents/researcher/events.jsonl

トラブルシューティング

「ルーター LLM が何も提案しなくなった。」 allowlist を確認してください。[] はルーターのみです。いくつかの Skill が必要なら列挙してください。すべてが必要なら、フィールドを削除するか null にしてください。

not in allowed_skills エラーが出るが LLM が同じ Skill を選び続ける。」 これは多層防御のパスです。ルーター側のフィルターは通常、ブロックされた Skill を LLM から隠すので、このブランチに到達するということは LLM が Skill 名を幻覚していることを意味します。ロールプロンプトを絞り込んで抑止するか、実際に必要なら Skill を allowlist に追加してください。

「Skill を allowlist に追加したが、ルーターがまだ選ばない。」 カタログに Skill が存在するか確認します:

reyn skills list

allowlist は既存のカタログをフィルタリングします。解決できない名前は黙って除外されます。

関連情報