summaryrefslogtreecommitdiff
path: root/doc/Specifications.md
diff options
context:
space:
mode:
Diffstat (limited to 'doc/Specifications.md')
-rw-r--r--doc/Specifications.md559
1 files changed, 559 insertions, 0 deletions
diff --git a/doc/Specifications.md b/doc/Specifications.md
new file mode 100644
index 0000000..9d13343
--- /dev/null
+++ b/doc/Specifications.md
@@ -0,0 +1,559 @@
+# AI Agent Sandbox MCP Server — 仕様書
+
+**文書名:** `Specifications.md`
+**版:** 0.1 Draft
+**対象OS:** Windows 11 x64
+**主実装:** C# / .NET 10 LTS
+**目的:** 実装前に、外部から観測可能な性質・制約・安全条件を一意に定義する。
+
+---
+
+## 1. 文書の位置付け
+
+### 1.1 仕様と設計の分離
+
+本書は「システムが何を満たすか」を定義する。実現手段、モジュール構成、Win32 APIの使い方などは `Design.md` に定義する。
+IPA「厳密な仕様記述入門」の考え方に従い、課題・仕様・設計を分離し、仕様は設計より上位の性質として扱う。
+
+| 文書 | 責務 | 主な読者 |
+| --- | --- | --- |
+| Specifications.md | 外部性質、機能、状態、制約、非機能、安全条件を定義 | 利用者、レビュー担当、実装担当 |
+| Design.md | 仕様を満たすための構造、データ、アルゴリズム、Windows強制方式を定義 | 実装担当、Codex、保守担当 |
+
+### 1.2 記述規則
+
+- **MUST / 必須**: 実装が必ず満たす。
+- **MUST NOT / 禁止**: 実装が行ってはならない。
+- **SHOULD / 推奨**: 原則として満たす。逸脱時は根拠を記録する。
+- **MAY / 任意**: 実装上の選択肢である。
+- 同一概念には必ず同一の用語を使用する。類義語を新しい概念として導入しない。
+
+### 1.3 仕様品質の観点
+
+本書は、完全性、一貫性、検証容易性、修正容易性、追跡性を重視する。妥当性確認は「この仕様がAIエージェントの安全な作業実行という目的に適合するか」、正当性検証は「設計・実装が本仕様を満たすか」と定義する。
+
+---
+
+## 2. 目的・課題・範囲
+
+### 2.1 解くべき課題
+
+外部AIエージェントから自然言語で作業依頼を受け、ローカルLLMで計画・判断し、Windows上で許可された操作だけを実行し、結果をテキストで返す。LLMの判断をセキュリティ境界として信用せず、OSとアプリケーションのポリシーで能力を制限する。
+
+### 2.2 システム境界
+
+| 境界内 | 境界外 |
+| --- | --- |
+| MCP Server、Agent Runtime、Ollama制御、Planner、Session、Skill、Policy Engine、Sandbox Broker、監査 | Ollamaサーバ本体、MCP Client、利用対象リポジトリ、外部ネットワーク |
+| Windows上の一時ACL/WFP/Job/AppContainer利用 | OS自体の完全仮想化、Hyper-V、WSL、Docker |
+
+### 2.3 v1の非対象
+
+- Legacy HTTP+SSE transportの後方互換対応。
+- WebSocketや独自TCP等の独自MCP transport。
+- 外部ネットワークからのStreamable HTTP接続。
+- Streamable HTTPのアプリ内TLS終端・HTTP認証。
+- SandboxPolicyのMCP経由での変更。
+- 固定System PromptのMCP/CLI/設定からの置換。
+- Hot Reload。
+- 永続Sessionデータベース。
+- WSL、Docker、VMを安全境界として利用すること。
+- Credential Manager、SSH key、API token等のSandboxへの継承。
+
+---
+
+## 3. 用語
+
+| 用語 | 定義 |
+| --- | --- |
+| MCP Client | 本システムをMCP Serverとして呼び出す外部AIエージェントまたはホスト。 |
+| MCP Tool | MCP Clientに公開する `agent_run` と `agent_status`。 |
+| Agent | Ollama、Planner、Internal Toolを用いてTaskを遂行する内部実行主体。 |
+| Agent Runtime | Agent Loop、Session、Ollama呼出し、Internal Tool調停を行う中核。 |
+| Internal Tool | Ollamaのnative tool callingにだけ公開され、MCP Clientには公開されない内部操作。 |
+| Task | 依頼を分割した意味的な作業単位。 |
+| TaskGraph | Taskとdependencyから成る有向非巡回グラフ。 |
+| Token PERT | TaskのLLM消費量をO/M/Pのtoken値で推定するPERT派生モデル。 |
+| Token CPM | TaskGraph上でexpected token costを重みとしてcritical pathを求めるモデル。 |
+| Token Budget Class | 1K~128KのTask単位token予算階級。Ollama `num_ctx`とは別概念。 |
+| Session | 会話、TaskGraph、Execution Resultをメモリ上に保持する論理単位。 |
+| SandboxPolicy | Filesystem、Process、Network、Resourceの許可範囲を表すホワイトリスト型ポリシー。 |
+| Sandbox | SandboxPolicyをWindows機構で強制したプロセス実行環境。 |
+| Sandbox Broker | プロセス起動・許可判定・Windows強制機構の調停を担当する信頼境界。 |
+| Application Profile | アプリケーション固定のAppContainer profile。Taskごとには作成・削除しない。 |
+| Task Resource | Task中だけ存在するACL、WFP filter、Job Object、一時ファイル等。 |
+| Approval | 実行ファイルのcanonical pathとSHA-256を信頼対象として登録する操作。 |
+| Fixed System Prompt | 実行ファイルに組み込まれ、利用者が変更できない最上位指示。 |
+| User System Prompt | 設定で指定可能だがFixed System Promptを上書きできない追加指示。 |
+| Skill | LLMへの補助指示を記述したMarkdown。実行権限そのものを与えない。 |
+| Locale | BCP 47形式を推奨する言語識別子。標準は `en` と `ja`。 |
+| Audit Log | セキュリティに関係する操作を通常ログと分離して記録する監査記録。 |
+| Recovery Journal | Task Resourceの適用・解除を復旧可能にする永続的な最小ジャーナル。 |
+
+---
+
+## 4. 利用者と主要利用シナリオ
+
+| ID | 主体 | シナリオ | 成功条件 |
+| --- | --- | --- | --- |
+| UC-01 | MCP Client | 自然言語の依頼を送信する | Task IDとSession IDを受領する |
+| UC-02 | MCP Client | Task状態を照会する | 状態と、完了時には最終回答をテキストで得る |
+| UC-03 | 利用者 | 画像付き依頼を送信する | Vision対応modelなら処理される |
+| UC-04 | 利用者 | 言語を指定して起動する | CLI/診断/MCP応答/LLM最終回答が指定言語になる |
+| UC-05 | 管理者 | SandboxPolicyを設定する | 未許可能力はdenyされる |
+| UC-06 | 管理者 | 実行ファイルを承認する | pathとSHA-256一致時だけ起動できる |
+| UC-07 | Agent | 計画を作成・更新する | TaskGraphがDAGを維持しToken CPMを再計算する |
+| UC-08 | Agent | Internal Toolを呼ぶ | Policy検査後にのみ副作用が発生する |
+| UC-09 | システム | 異常終了から復旧する | 残留Task Resourceを除去してから受付開始する |
+
+---
+
+## 5. 外部インターフェース仕様
+
+### 5.1 MCP Transport
+
+| ID | Transport | 要件 |
+| --- | --- | --- |
+| MCP-TR-01 | stdio | MUST対応。既定transportとする。 |
+| MCP-TR-02 | Streamable HTTP | MUST対応。loopbackのみlisten可能とする。 |
+| MCP-TR-03 | Legacy HTTP+SSE | MUST NOT対応。後方互換fallbackも実装しない。 |
+| MCP-TR-04 | Streamable HTTP SSE stream | v1では提供しない。GETによるevent streamは提供しない。 |
+| MCP-TR-05 | 独自transport | MUST NOT実装。 |
+
+### 5.2 MCP Tool
+
+| Tool | 用途 | 処理モデル | 返却 |
+| --- | --- | --- | --- |
+| agent_run | 新規または既存Sessionに依頼を登録 | 非同期 | Task ID、Session IDを含むテキスト |
+| agent_status | Task状態を取得 | 同期照会 | 状態、進捗要約、完了時最終回答を含むテキスト |
+
+### 5.3 agent_run入力要件
+
+| ID | 項目 | 必須 | 要件 |
+| --- | --- | --- | --- |
+| MCP-RUN-01 | request | Yes | 空でないUTF-8テキスト。主I/F。 |
+| MCP-RUN-02 | session_id | No | 指定時は存在するSessionへ継続。未指定時は新規Session。 |
+| MCP-RUN-03 | temperature | No | 当該TaskのOllama呼出しにのみ適用する一時override。設定を書き換えない。 |
+| MCP-RUN-04 | images | No | 画像0件以上。Vision対応model利用時のみ処理。 |
+| MCP-RUN-05 | その他LLM設定 | No | model、system prompt、context等をMCPから変更してはならない。 |
+
+### 5.4 agent_status入力要件
+
+| ID | 項目 | 必須 | 要件 |
+| --- | --- | --- | --- |
+| MCP-STS-01 | task_id | Yes | agent_runが返したTask ID。 |
+| MCP-STS-02 | session_id | No | 指定時はTaskとの整合を検査する。 |
+
+### 5.5 Task状態
+
+| 状態 | 意味 | 遷移先 |
+| --- | --- | --- |
+| queued | 受付済み、未開始 | planning / cancelled / failed |
+| planning | TaskGraph作成・更新中 | running / failed |
+| running | Internal ToolまたはLLM処理中 | planning / completed / failed / cancelled |
+| completed | TaskGraph全ノード完了 | 終端 |
+| failed | 回復不能な失敗 | 終端 |
+| cancelled | 安全停止完了 | 終端 |
+
+### 5.6 CLI
+
+v1のCLI surfaceは次に限定する。
+
+```text
+agent-mcp serve [--config <path>] [--lang <locale>] [--transport <stdio|http>]
+agent-mcp check [--config <path>] [--lang <locale>]
+```
+
+CLIは起動方式と表示言語を変更するためのI/Fであり、SandboxPolicyやOllama sampling値を個別overrideするI/Fにしない。
+
+---
+
+## 6. Ollama機能仕様
+
+| ID | 対象 | 仕様 |
+| --- | --- | --- |
+| OLL-01 | Backend | LLM backendはOllamaのみに限定する。 |
+| OLL-02 | API | 会話とtool callingはOllama Chat APIを使用可能とする。 |
+| OLL-03 | Options | Ollamaが提供する生成optionを設定ファイルから変更可能にする。 |
+| OLL-04 | Typed Options | 既知optionは型付きで検証する。 |
+| OLL-05 | Extra Options | 将来追加optionのため `extra_options` を許可する。既知optionとの競合は既知optionを優先する。 |
+| OLL-06 | Temperature | 設定値を既定とし、agent_runのoptional値だけTask scopeで上書き可能。 |
+| OLL-07 | Model | MCPから変更不可。 |
+| OLL-08 | System Prompt | MCPから変更不可。Fixed System Promptは設定からも変更不可。 |
+| OLL-09 | Vision | MCPから画像をoptional入力可能。非対応modelではlocalized error。 |
+| OLL-10 | Tool Calling | Internal ToolにOllama native tool callingを使用する。 |
+| OLL-11 | Tool Guard | 実行が必要なTaskでtool callが行われない場合、未実行を検出して再試行する。 |
+| OLL-12 | Retry | Ollama通信失敗は既定3回まで再試行する。 |
+| OLL-13 | Usage | `prompt_eval_count` と `eval_count` をTask実測tokenとして記録する。 |
+
+---
+
+## 7. Agent Runtime仕様
+
+### 7.1 Agent Loop
+
+| ID | 要件 |
+| --- | --- |
+| AGT-01 | 正常終了条件はTaskGraphの全Taskがcompletedであること。 |
+| AGT-02 | 既定 `max_iterations` は128。超過時はfailed。 |
+| AGT-03 | 同一原因と判定した失敗が5回連続した場合はfailed。 |
+| AGT-04 | Taskが外部操作を必要とする場合、LLMの文章上の「実施した」という主張だけを完了根拠にしない。 |
+| AGT-05 | 副作用はInternal Tool経由でのみ実行する。 |
+| AGT-06 | Internal ToolはMCP Clientに列挙・公開しない。 |
+
+### 7.2 Tool未使用検出
+
+AgentはTaskの期待副作用と観測結果を比較し、実行が必要なのにtool callが0件の場合はTaskをcompletedにしない。再試行はAgent Loopの失敗回数へ算入する。純粋な説明・分析Taskにはtool callを強制しない。
+
+---
+
+## 8. Planner仕様
+
+### 8.1 TaskGraph
+
+| ID | 要件 |
+| --- | --- |
+| PLN-01 | TaskGraphはDAGでなければならない。cycleを検出した更新は拒否する。 |
+| PLN-02 | 既定 `max_tasks` は32。 |
+| PLN-03 | completed Taskはimmutable。 |
+| PLN-04 | 未完了Taskの追加とdependency追加を許可する。 |
+| PLN-05 | TaskGraph変更後はToken CPMを再計算する。 |
+| PLN-06 | Taskは意味的作業単位とし、Token Budget Classとは分離する。 |
+
+### 8.2 Token Budget Class
+
+| Class | Token上限 |
+| --- | --- |
+| 1K | 1,024 |
+| 2K | 2,048 |
+| 4K | 4,096 |
+| 8K | 8,192 |
+| 16K | 16,384 |
+| 32K | 32,768 |
+| 64K | 65,536 |
+| 128K | 131,072 |
+
+Token Budget ClassはTask全体に許されるLLM token消費の計画値であり、単一Ollama callのcontext window (`num_ctx`) ではない。複数callの合計がTask実績となる。
+
+### 8.3 Token PERT
+
+- 各Taskは `optimistic_tokens (O)`、`most_likely_tokens (M)`、`pessimistic_tokens (P)` を持つ。
+- 不変条件は `0 < O <= M <= P <= token_budget` とする。
+- 期待token costは `E = (O + 4M + P) / 6` とする。
+- Critical Pathは依存経路上の `E` の合計が最大の経路とする。
+- Token CPMは実行時間を予測しない。依存連鎖のLLMコストと優先度を可視化するために使用する。
+- 全Taskの総token予算はCritical Pathとは別に合計して管理する。
+
+### 8.4 実測
+
+Task実績はOllama応答の `prompt_eval_count` をinput token、`eval_count` をoutput tokenとして累積し、`actual_total_tokens = input + output` を保持する。v1では実績による自動学習補正は行わず、将来の推定改善に利用可能な記録だけを残す。
+
+---
+
+## 9. Session・Context仕様
+
+| ID | 要件 |
+| --- | --- |
+| SES-01 | Sessionを持つ。完全statelessにはしない。 |
+| SES-02 | Session IDをMCP I/Fへ公開する。 |
+| SES-03 | Sessionはプロセスメモリにのみ保持し、アプリ終了時に消失してよい。 |
+| SES-04 | Sessionはconversation、TaskGraph、Execution Resultを保持する。 |
+| SES-05 | context上限接近時は古い情報を単純削除せず要約する。 |
+| SES-06 | 要約後も未完了Task、security decision、重要なexecution result、利用者制約を保持する。 |
+
+---
+
+## 10. Skill・Prompt仕様
+
+### 10.1 Prompt優先順位
+
+優先順位は `Fixed System Prompt > User System Prompt > Runtime Context > Conversation` とする。下位層は上位層の禁止事項・安全条件を上書きできない。
+
+| 層 | 変更主体 | 内容 |
+| --- | --- | --- |
+| Fixed System Prompt | アプリケーションのみ | 安全不変条件、tool利用規則、完了判定 |
+| User System Prompt | 設定所有者 | プロジェクト固有の追加指示 |
+| Runtime Context | Agent Runtime | locale、選択Skill、Sandbox capability、TaskGraph |
+| Conversation | MCP Client/Agent | 依頼と対話履歴 |
+
+### 10.2 Skill
+
+- SkillはMarkdown instructionである。
+- Skillロードは権限付与を意味しない。
+- 必要なSkillだけを選択する。
+- Skill選択はLLMにより行うが、選択可能集合は設定されたSkill directoryに限定する。
+
+---
+
+## 11. SandboxPolicy仕様
+
+### 11.1 基本原則
+
+- **ホワイトリスト方式**を採用する。未指定能力はdenyする。
+- 子・孫プロセスは親より強い権限を取得できない。
+- LLMはSandboxPolicyを変更できない。
+- Policy変更は設定変更とアプリ再起動を必要とする。
+- v1で開放可能なのはFilesystem、Process、Network、Resourceとする。その他能力はdenyとする。
+
+### 11.2 Filesystem Policy
+
+| 権限 | 意味 |
+| --- | --- |
+| read | ファイル内容読取、directory列挙。 |
+| write | create、overwrite、renameを含む。deleteは含まない。 |
+| execute | 対象ファイルを実行対象として利用できる。Process approvalも別途必要。 |
+| delete | ファイルまたはdirectoryを削除できる。 |
+
+| ID | 要件 |
+| --- | --- |
+| FS-01 | 指定粒度はdirectoryまたはfile。workspaceという特別な権限単位は持たない。 |
+| FS-02 | pathはcanonicalize後にPolicy評価する。 |
+| FS-03 | symlink、junction、その他reparse pointを経由した許可範囲外への脱出を禁止する。 |
+| FS-04 | write権限だけではdeleteできない。 |
+| FS-05 | ACLとAppContainerの両方で強制可能な形にする。 |
+
+### 11.3 Process Policy
+
+| ID | 要件 |
+| --- | --- |
+| PRC-01 | 実行対象はcanonical pathとSHA-256が承認記録と一致しなければならない。 |
+| PRC-02 | 実行ファイル更新でhashが変化した場合は自動許可せず再承認を要求する。 |
+| PRC-03 | path変更も再承認を要求する。 |
+| PRC-04 | cmd.exe、powershell.exe、pwsh.exeは機能上デフォルト許可とするが、承認照合を免除しない。 |
+| PRC-05 | shell categoryは設定で禁止可能。 |
+| PRC-06 | すべてのdescendant processに同等以下のSandboxPolicyを適用する。 |
+| PRC-07 | 実行前判定はSandbox Brokerが行う。 |
+
+### 11.4 Network Policy
+
+- Network modeは `deny` と `allow` の2値とする。
+- `deny` はlocalhostを含む全通信を拒否する。
+- `allow` はhost/port allow-listに一致するoutboundだけを許可する。
+- allow-listが空の `allow` は実質denyとして扱い、全開放を意味しない。
+- host名はhostsファイルに近い単純な列挙思想で扱い、汎用Firewall言語は実装しない。
+
+### 11.5 Resource Policy
+
+| 資源 | 要件 |
+| --- | --- |
+| process count | 上限を設定可能。Job配下全体に適用。 |
+| memory | 上限を設定可能。 |
+| wall-clock timeout | TaskまたはProcessの停止条件として設定可能。 |
+| child process | 親と同等以下の制約下でのみ許可。 |
+
+### 11.6 v1で明示denyする能力
+
+- Registry write
+- 任意COM/Automation
+- Device直接アクセス
+- Camera/Microphone
+- Credential Manager
+- SSH keyの自動継承
+- API token/secretの自動継承
+- Sandbox外のNamed Pipe/IPC
+
+---
+
+## 12. File Editing仕様
+
+- overwrite、patch、atomic replaceを併用できる。
+- 通常は変更前内容をメモリに保持し、編集後検証に失敗した場合にrollbackする。
+- 設定されたmemory backup閾値を超える大容量ファイルでは、Sandbox管理下の一時backupを使用できる。
+- 利用者向け恒久 `.bak` ファイルは既定で作成しない。
+- atomic replaceが適用可能な操作では、部分書込み状態を利用者から観測させないことを優先する。
+
+---
+
+## 13. Application Profile・Task Resource仕様
+
+- AppContainer profileはapplication固定とする。
+- Task終了時にApplication Profileを削除しない。
+- Task固有ACL、WFP filter、Job Object、一時ファイル等はTask Resourceとして管理する。
+- Task Resourceは正常終了・失敗・cancelのいずれでも残留させない。
+- crashで残留可能性がある変更はRecovery Journalにより次回起動時に回収する。
+- MCP受付開始前にRecoveryを完了し、clean stateを確認しなければならない。
+
+---
+
+## 14. 国際化仕様
+
+| ID | 要件 |
+| --- | --- |
+| I18N-01 | アプリケーション管理メッセージをソースコードへハードコードしない。 |
+| I18N-02 | 標準localeとして `locales/en.json` と `locales/ja.json` を配布する。 |
+| I18N-03 | ユーザーは `zh-CN.json` 等を追加し、アプリ変更なしでlocaleを追加できる。 |
+| I18N-04 | locale識別子はBCP 47形式を推奨する。 |
+| I18N-05 | `--lang <locale>` で起動時に選択可能。 |
+| I18N-06 | 優先順位は CLI > config > built-in default(en)。 |
+| I18N-07 | 選択言語はCLI、診断、MCPテキスト応答、LLM最終回答へ適用する。 |
+| I18N-08 | 入力言語の自動検出による切替は行わない。 |
+| I18N-09 | placeholderは `{task}` のようなnamed placeholderを使う。 |
+| I18N-10 | missing keyは 選択locale → en → key文字列 の順にfallbackする。 |
+| I18N-11 | 壊れたJSONまたは未知keyを含むlocale fileはfatal errorとする。 |
+
+---
+
+## 15. Configuration仕様
+
+- 主設定形式はYAML。
+- `schema_version` を必須とする。
+- 設定変更の反映には再起動を必須とする。
+- Hot Reloadは明示的に非対応。
+- CLIの `--config` で設定ファイルpathを選択可能。
+- 起動時にschema、path、hash approval、locale、policyの静的validationを行う。
+
+---
+
+## 16. Logging・Audit仕様
+
+| 種別 | 要件 |
+| --- | --- |
+| Application Log | stderrに出力可能。stdio時stdoutへログを出してはならない。ファイルにも保存する。 |
+| LLM Log | promptとresponseを記録する。secretを継承しない前提でも、ログ出力先は保護する。 |
+| Audit Log | 通常ログと分離する。process、args、exit code、file write、delete、denied access等を記録する。 |
+| Token Metrics | Task/Call単位のinput/output/total tokenを記録する。 |
+
+---
+
+## 17. Recovery・異常系仕様
+
+| ID | 異常 | 要求動作 |
+| --- | --- | --- |
+| REC-01 | Ollama unavailable | 既定3回retry後、Taskをfailed。 |
+| REC-02 | Process hang | timeout後、安全にJob配下を停止。 |
+| REC-03 | Application終了 | Job Object配下を必ずkillする。 |
+| REC-04 | stdio EOF/Client消失 | 当該Client所有のTaskを安全停止する。 |
+| REC-05 | Streamable HTTP session終了 | 当該Session所有のTaskを安全停止する。通常のHTTP request完了は切断とみなさない。 |
+| REC-06 | crash後起動 | Recovery Journalに基づき残留Task Resourceをcleanにしてからserveする。 |
+| REC-07 | cleanup失敗 | serveを開始せずfatal errorとする。 |
+
+---
+
+## 18. セキュリティ不変条件
+
+| ID | 不変条件 |
+| --- | --- |
+| SEC-INV-01 | LLMの出力だけでは権限を増加できない。 |
+| SEC-INV-02 | MCP ClientはSandboxPolicyを変更できない。 |
+| SEC-INV-03 | descendant processは親より強い権限を持てない。 |
+| SEC-INV-04 | 未許可Filesystem pathへR/W/E/Deleteできない。 |
+| SEC-INV-05 | 承認hashと一致しない実行ファイルを起動できない。 |
+| SEC-INV-06 | Network denyではlocalhostを含め通信できない。 |
+| SEC-INV-07 | Network allowでもallow-list外host/portへ通信できない。 |
+| SEC-INV-08 | CredentialをSandboxへ暗黙継承しない。 |
+| SEC-INV-09 | Fixed System Promptは利用者入力で置換できない。 |
+| SEC-INV-10 | Task終了後にTask Resourceを残さない。 |
+| SEC-INV-11 | Recovery未完了状態でMCP受付を開始しない。 |
+| SEC-INV-12 | stdio stdoutにはMCP protocol以外を書かない。 |
+
+---
+
+## 19. 非機能要求
+
+| ID | 品質 | 要求 |
+| --- | --- | --- |
+| NFR-01 | Security | default deny、least privilege、explicit approvalを優先する。 |
+| NFR-02 | Determinism | Policy評価、TaskGraph検証、PERT/CPM計算はLLMに依存せず決定的に実行する。 |
+| NFR-03 | Recoverability | crash後にclean stateへ復帰できる。 |
+| NFR-04 | Maintainability | 外部MCP Toolを2個に固定し、内部責務を分離する。 |
+| NFR-05 | Dependency Control | 標準ライブラリで実現可能な機能に新規依存を追加しない。 |
+| NFR-06 | Portability | v1はWindows 11 x64専用。Windows機構を抽象化し過ぎない。 |
+| NFR-07 | Observability | Task、Tool、Process、Token、Policy denialを追跡可能にする。 |
+| NFR-08 | Localization | 英語・日本語を標準提供し、追加localeをコード変更なしで導入可能。 |
+| NFR-09 | Readability | 設定、ログ、仕様語彙を一貫させる。 |
+
+---
+
+## 20. 受入基準
+
+| ID | 検証条件 |
+| --- | --- |
+| AT-01 | stdioでinitialize→agent_run→agent_statusが成立する。 |
+| AT-02 | Streamable HTTPを127.0.0.1/::1で利用でき、非loopback bindは拒否される。 |
+| AT-03 | Legacy HTTP+SSE endpointを提供しない。 |
+| AT-04 | agent_runがTask ID/Session IDを返し、完了前にblockingし続けない。 |
+| AT-05 | MCP temperature overrideがTask scopeのみで有効。 |
+| AT-06 | 非Vision modelへ画像指定時、選択localeのerrorが返る。 |
+| AT-07 | 未許可file read/write/deleteがOSまたはBrokerで拒否されAuditに残る。 |
+| AT-08 | reparse point経由で許可path外へ到達できない。 |
+| AT-09 | 承認hash変更後のexe実行が拒否される。 |
+| AT-10 | Network denyでloopbackを含む通信が拒否される。 |
+| AT-11 | allow-list外host/portへの通信が拒否される。 |
+| AT-12 | 子プロセス・孫プロセスがJobとSandbox制約から逸脱できない。 |
+| AT-13 | Task crash後、次回起動RecoveryでTask Resourceが除去される。 |
+| AT-14 | TaskGraph cycle追加が拒否される。 |
+| AT-15 | completed Taskが変更されない。 |
+| AT-16 | O/M/Pからexpected tokenが決定的に計算される。 |
+| AT-17 | Ollama実測token数がTask実績へ累積される。 |
+| AT-18 | ja/en切替がCLI、MCP応答、LLM回答へ反映される。 |
+| AT-19 | 追加localeがコード変更なしでロードされる。 |
+| AT-20 | 未知locale keyまたは壊れたJSONで起動/checkが失敗する。 |
+
+---
+
+## 21. 要求トレーサビリティ
+
+| 仕様領域 | 主要Requirement | Design.md対応章 |
+| --- | --- | --- |
+| MCP | MCP-TR / MCP-RUN / MCP-STS | 5章 |
+| Ollama | OLL-* | 6章 |
+| Agent | AGT-* | 7章 |
+| Planner | PLN-* | 8章 |
+| Session | SES-* | 9章 |
+| Sandbox | FS-* / PRC-* / SEC-INV-* | 10〜13章 |
+| i18n | I18N-* | 14章 |
+| Recovery | REC-* | 16章 |
+| NFR | NFR-* | 全章横断 |
+
+---
+
+## 22. 参考資料
+
+- IPA/SEC「実務家のための形式手法 厳密な仕様記述を志すための形式手法入門 厳密な仕様記述入門」2013年。仕様と設計の分離、構造・機能・振る舞い・非機能、Validation/Verification、完全性・一貫性等の記述原則を参考にした。
+- Model Context Protocol Specification: standard transportsとしてstdioとStreamable HTTPを参照し、旧HTTP+SSE transportは非対応とした。
+- Ollama API Reference: Chat APIのtools/images/optionsおよび `prompt_eval_count` / `eval_count` を参照した。
+
+---
+
+## 23. 変更管理
+
+- 本仕様の変更は `schema_version`、MCP Tool schema、SandboxPolicy、安全不変条件への影響を必ず確認する。
+- Design.mdが本仕様と矛盾した場合は本仕様を優先し、Design.mdを修正する。
+- 実装都合で仕様を暗黙変更してはならない。必要な場合は先に仕様を変更する。
+
+---
+
+## 24. Requirement ID索引
+
+- `MCP-TR-*`: MCP transport
+- `MCP-RUN-*`: agent_run
+- `MCP-STS-*`: agent_status
+- `OLL-*`: Ollama
+- `AGT-*`: Agent Loop
+- `PLN-*`: Planner
+- `SES-*`: Session
+- `FS-*`: Filesystem
+- `PRC-*`: Process
+- `I18N-*`: Localization
+- `REC-*`: Recovery
+- `SEC-INV-*`: Security invariant
+- `NFR-*`: Non-functional
+- `AT-*`: Acceptance
+
+## 25. 仕様上の禁止事項一覧
+
+- MCP ClientへInternal Toolを公開すること。
+- MCP requestでSystem Prompt、model、SandboxPolicyを変更すること。
+- `temperature` overrideを永続設定へ書き戻すこと。
+- Legacy HTTP+SSEを互換目的で自動有効化すること。
+- Streamable HTTPをloopback外にbindすること。
+- write permissionだけでdeleteを許可すること。
+- reparse point解決前の文字列pathだけでallow判定すること。
+- hash不一致の実行ファイルを自動再承認すること。
+- Network `allow`をunrestricted outboundとして解釈すること。
+- 子プロセスに親より広いcapabilityを付与すること。
+- Skill選択を権限付与として扱うこと。
+- completed Taskを書き換えること。
+- Token Budget ClassをOllama context lengthと同一視すること。
+- context要約で未完了Taskや利用者制約を消すこと。
+- cleanup失敗状態でserveを開始すること。