blob: 5d210371a06104793414a4b7a3ef5c51f6b453c2 (
plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
286
287
288
289
290
291
292
293
294
295
296
297
298
299
300
301
302
303
304
305
306
307
308
309
310
311
312
313
314
315
316
317
318
319
320
321
322
323
324
325
326
327
328
329
330
331
332
333
334
335
336
337
338
339
340
341
342
343
344
345
346
347
348
349
350
351
352
353
354
355
356
357
358
359
360
361
362
363
364
365
366
367
368
369
370
371
372
373
374
375
376
377
378
379
380
381
382
383
384
385
386
387
388
389
390
391
392
393
394
395
396
397
398
399
400
401
402
403
404
405
406
407
408
409
410
411
412
413
414
415
416
417
418
419
420
421
422
423
424
425
426
427
428
429
430
431
432
433
434
435
436
437
438
439
440
441
442
443
444
445
446
447
448
449
450
451
452
453
454
455
456
457
458
459
460
461
462
463
464
465
466
467
468
469
470
471
472
473
474
475
476
477
478
479
480
481
482
483
484
485
486
487
488
489
490
491
492
493
494
495
496
497
498
499
500
501
502
503
504
505
506
507
508
509
510
511
512
513
514
515
516
517
518
519
520
521
522
523
524
525
526
527
528
529
530
531
532
533
534
535
536
537
538
539
540
541
542
543
544
545
546
547
548
549
550
551
552
553
554
555
556
557
558
559
560
561
562
563
564
565
566
567
568
569
570
571
572
573
574
575
576
577
578
579
580
581
582
583
584
585
586
587
588
589
590
591
592
593
594
595
596
597
598
599
600
601
602
|
# 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.5.1 v1実行並列性
- 複数Taskを `queued` として同時に受け付けることができる。
- アプリケーション全体で `planning` または `running` になれるTaskは最大1件とする。
- Task Resourceを適用できるTaskも同時に最大1件とする。
- `agent_run` の非同期受付は維持し、実行待ちTaskは受付順の単一キューで処理する。
### 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にしない。
### 5.7 MCP 2026-07-28とTasks Extension
| ID | 要件 |
| --- | --- |
| MCP-2026-01 | HTTPの主経路はMCP `2026-07-28`とし、`server/discover`およびrequest単位の必須`_meta`を処理する。 |
| MCP-2026-02 | HTTPはstatelessとし、`Mcp-Session-Id`を発行・要求しない。既存`session_id`はAgent会話IDでありtransport sessionではない。 |
| MCP-2026-03 | 旧initialize clientは公式SDKのdual-era fallbackで受け付けるが、Legacy HTTP+SSE endpointは提供しない。 |
| MCP-2026-04 | `io.modelcontextprotocol/tasks`を公式Extensionとして宣言する。対応clientの`agent_run`はTask result、非対応clientは従来のqueued textを受け取る。 |
| MCP-2026-05 | MCP Task IDとAgent Task IDは同一UUIDで相関し、`tasks/get`と`agent_status`のどちらからも同じ作業を追跡可能にする。 |
| MCP-2026-06 | Agentの`queued/planning/running`はMCP `working`へ、terminal状態は対応するTask terminal状態へ写像する。 |
| MCP-2026-07 | MCP Taskは設定可能なTTL/poll intervalを持ち、process restart後の未完了Taskは`failed/server_restarted`へ確定する。実行は再開しない。 |
### 5.8 起動・HTTP観測性
- `serve`はbind前に管理者権限、BFE、WFP transaction、filter add/deleteを検査し、不足時は具体的なerrorと対処をstderrへ出してexit code 2で終了しなければならない。
- ready messageは実際のtransport開始後だけ出力し、HTTPではendpoint/protocol/stateless/PID/log path、stdioではprotocol/PID/log pathを含める。
- HTTP request logは実socketのremote/local endpoint、method、path、status、duration、標準MCP routing headerを記録可能とする。
- `Authorization`、`Cookie`、query、body、prompt、画像、Base64をrequest logへ記録してはならず、`X-Forwarded-For`を接続元として信用してはならない。
---
## 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として記録する。 |
Vision入力は設定可能な画像数、1画像あたりのsize、request合計sizeの上限を持ち、上限超過をOllama呼出し前に拒否しなければならない。具体的な既定値は設計および設定schemaで定義する。
---
## 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を強制しない。Sandbox Policyによる未許可操作は修正可能なTool失敗としてLLMへ再試行させず、初回のdenyでTaskをfailedにしてcleanupを実行する。
Internal Toolが返す読取・検索・tail結果は設定可能な上限を持ち、contextを無制限に消費してはならない。上限値は設計および設定schemaで定義する。
---
## 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、利用者制約を保持する。 |
Context要約を開始する利用率閾値は設定可能でなければならない。具体値は設計および設定schemaで定義する。
---
## 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の両方で強制可能な形にする。 |
| FS-06 | ディレクトリ作成 (mkdir) はwrite権限で許可する。ディレクトリ削除 (rmdir) はdelete権限で許可するが、空ディレクトリのみとする。ディレクトリ列挙 (list) はread権限で許可する。 |
### 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を使用できる。
- memory 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 server停止/明示cancel | 対象Taskを安全停止する。stateless HTTPのrequest完了やsocket切断はAgent Session終了とみなさない。 |
| 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が失敗する。 |
### 20.1 Operational E2E
| ID | 検証条件 |
| --- | --- |
| E2E-01 | ソースツリー外へ展開したRelease Bundleだけを使い、local Ollamaとstdio MCP Clientから実際のfixture修正、build、test、日本語応答、Audit追跡、Task Resource cleanupまで完走する。 |
| E2E-02 | E2E-01と同等の作業をloopback限定Streamable HTTPで完走する。 |
v1の完了には、win-x64向けself-contained Release Bundleが単独起動でき、E2E-01とE2E-02がInternetまたはcloud modelに依存せずPASSすることを必須とする。
---
## 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を開始すること。
|