summaryrefslogtreecommitdiff
path: root/doc/Design.md
diff options
context:
space:
mode:
authortanaka takashi <isazaka@gmail.com>2026-08-11 21:44:53 +0900
committertanaka takashi <isazaka@gmail.com>2026-08-11 21:44:53 +0900
commit6c3458a5ec37a5b69957ad17c84de58984698f25 (patch)
treebe5c5716e7488fcf1bc1a58de0ded0b9238f34cb /doc/Design.md
parentb5ccecca01007f2a2459265df6d749fbfd31aa84 (diff)
Audit and align v1 runtime design
Diffstat (limited to 'doc/Design.md')
-rw-r--r--doc/Design.md40
1 files changed, 27 insertions, 13 deletions
diff --git a/doc/Design.md b/doc/Design.md
index 798a134..dfce7f3 100644
--- a/doc/Design.md
+++ b/doc/Design.md
@@ -194,6 +194,10 @@ completed_tasks: <n>/<total>
current_task: <localized summary or empty>
token_usage: input=<n> output=<n> total=<n>
critical_path_tokens: <n>
+iterations: <n>
+replans: <n>
+last_error_code: <stable code or empty>
+last_error: <localized message or empty>
message: <localized status>
result: <final natural-language answer; completed only>
```
@@ -249,14 +253,14 @@ overrideはTask objectにcopyし、global configurationを変更しない。Sess
- 既定上限は4画像、1画像10 MiB、request合計20 MiBとする。
- model capability確認でVision非対応と判定した場合はOllama呼出し前にlocalized error。能力確認不能時は呼出しを行い、Ollama errorを正規化して返す。
### 6.5 Tool calling
-Ollamaに公開するInternal Toolは次の6群に固定する。個々のOS command (`grep.exe`等) をtoolとして増殖させない。
+Ollamaに公開する現行Internal Tool catalogは次のとおりとする。個々のOS command (`grep.exe`等) をtoolとして増殖させない。catalogの構成は設計事項であり、仕様上の固定数として扱わない。
| Tool | 責務 | 主なoperation |
| --- | --- | --- |
| file_search | 検索 | glob / name / text / regex / tail相当 |
| file_read | 読取 | whole / range / metadata |
| file_edit | 編集 | overwrite / patch / atomic_replace / delete |
| process_run | 承認済Process実行 | exe + args + cwd + timeout |
-| task_update | TaskGraph更新 | add / dependency / state / estimate |
+| task_update | TaskGraph更新 | add / dependency / estimate |
| dir | ディレクトリ操作 | mkdir / rmdir / list |
---
## 7. Internal Tool Schema設計
@@ -308,17 +312,17 @@ Ollamaに公開するInternal Toolは次の6群に固定する。個々のOS com
### 7.5 task_update
```json
{
- "operation":"add|add_dependency|set_state|set_estimate",
+ "operation":"add|add_dependency|set_estimate",
"task_id":"string|null",
"description":"string|null",
"depends_on":["string"],
"budget_class":"1K|2K|4K|8K|16K|32K|64K|128K|null",
"optimistic_tokens":0,
"most_likely_tokens":0,
- "pessimistic_tokens":0,
- "state":"queued|planning|running|completed|failed|cancelled|null"
+ "pessimistic_tokens":0
}
```
+Task状態遷移はAgent Runtimeだけが行う。`task_update` はTask追加、dependency追加、estimate変更に限定し、LLMから状態を変更するschemaを公開しない。
PlannerがDAG、不変条件、completed immutable、max_tasksを再検査してから適用する。
### 7.6 dir
```json
@@ -330,7 +334,7 @@ PlannerがDAG、不変条件、completed immutable、max_tasksを再検査して
- 既存の PathPolicy / CanonicalPath / TaskAclManager (root継承ACE) / TaskResourceJournal / RecoveryManager 枠組みを利用する。新規作成ディレクトリは親の継承ACEを自動取得するため追加ACL操作は不要。
- mkdir後crash → ディレクトリ削除、rmdir後crash → 空ディレクトリ再作成、でRecoveryする。
### 7.7 ToolUseGuard
-Taskには `requires_external_effect` をPlanner内部属性として持たせる。**Planning フェーズで LLM structured output により Task ごとに判定・設定される**(keyword heuristic ではない)。trueのTaskで、当該iteration中のtool callが0かつ完了証拠がない場合、LLMへ「未実行」を示すsystem-generated observationを追加して再試行する。同一失敗fingerprintが5回に達したらTaskをfailedにする。ただし、Policy EngineのdenyおよびSandbox backendの`UnauthorizedAccessException`は`RetryAllowed=false`のterminal Tool resultへ変換する。Runtimeはobserverへ結果を1回記録した直後にTaskをfailedへ遷移させ、LLMへ再投入しない。Policy deny後は再計画(replan)が可能(§8.4)。
+Taskには `requires_external_effect` をPlanner内部属性として持たせる。**Planning フェーズで LLM structured output により Task ごとに判定・設定される**(keyword heuristic ではない)。trueのTaskで、当該iteration中のtool callが0かつ完了証拠がない場合、LLMへ「未実行」を示すsystem-generated observationを追加して再試行する。同一失敗fingerprintが5回に達したらTaskをfailedにする。ただし、Policy EngineのdenyおよびSandbox backendの`UnauthorizedAccessException`は`RetryAllowed=false`のterminal Tool resultへ変換する。Runtimeはobserverへ結果を1回記録した後、同一Tool呼出しへ再投入せず、§8.4の条件付きreplanへ遷移する。
---
## 8. Token Planner設計
### 8.1 Task model
@@ -364,7 +368,10 @@ topological sort後にforward passで各Taskの累積expected token costを計ç®
- 実績がPを超過しても即失敗にはせず、remaining Taskのestimate見直しをLLMへ要求できる。
- `max_tasks=32`超過提案は拒否し、既存Taskの統合をLLMへ求める。
- Budget Classは意味的Taskを分割する唯一の理由にしない。Taskが複数独立成果物を含む場合に分割する。
-- Policy deny時は replan を最大3回まで試行可能。同一 deny が繰り返される場合は Failed へ遷移。
+- Policy denyは同一Tool呼出しへ再投入しない。許可済み能力だけで代替できる可能性がある場合、`running -> planning -> running` と遷移してreplanを最大3回まで試行できる。
+- completed TaskのID、状態、usageを保持する。failed Taskをdependency解決済みとして扱わない。
+- 同一deny fingerprintの再発、計画未変更、実行可能Taskなし、structured replan失敗は即Failedとする。全Taskがcompletedの場合だけAgent Taskをcompletedにする。
+- structured planが空または不正な場合は`think=false`で1回だけ再試行し、それでも失敗した場合はplanning failureとする。外部効果要否が不明なfallback graphは作成しない。
### 8.5 Ollama usage集計
1 Ollama callの `prompt_eval_count` をTask inputへ、`eval_count` をTask outputへ加算する。tool実行そのものにはtoken costを加算しない。context summary生成に使ったtokenはSession maintenance Taskとして別集計する。
---
@@ -462,6 +469,7 @@ skills:
logging:
directory: logs
```
+base YAMLと同じdirectoryに`agent.local.yaml`が存在する場合、YAML nodeを読み取ってmapを再帰mergeし、scalarとsequenceはlocal nodeで置換してからtyped configurationへdeserializeする。unknown propertyを含むvalidationはmerge後に行い、全相対pathのbaseはbase YAMLのdirectoryとする。local file、そこから参照するUser System PromptおよびSkill directoryはRelease Bundleのpublish入力に含めない。
### 10.2 Filesystem entry
各list itemはpath文字列とする。起動時に絶対canonical pathへ正規化して保持する。file/directoryは実在時に種別を記録し、未作成write targetは最も近い既存親directoryまで検査する。
### 10.3 Process approval entry
@@ -599,7 +607,7 @@ patchは適用前にtarget hashまたはcontext一致を検査する。曖昧適
- log levelは設定可能だがCLI optionにはしない。
- stdoutへ通常ログを出すコードはtestで禁止する。
### 15.2 LLM log
-call ID、session ID、task ID、model、request metadata、prompt、response、tool_calls、token usageを記録する。秘密情報の自動継承は禁止だが、利用者入力にsecretが含まれる可能性はあるためlog directoryはuser-only ACLにする。
+call ID、session ID、task ID、Planner Task ID、phase、iteration、replan番号、model、request metadata、prompt、response、tool_calls、token usageを記録する。Planning、Skill選択、再計画、実行、context要約を同じ相関形式で記録し、Tool resultにもcall IDとiterationを付ける。秘密情報の自動継承は禁止だが、利用者入力にsecretが含まれる可能性はあるためlog directoryはuser-only ACLにする。既存rotation設定はLLM logにも適用する。
### 15.3 Audit JSONL
Auditはappend-only JSONLを採用する。1 event = 1 line。
```json
@@ -607,7 +615,7 @@ Auditはappend-only JSONLを採用する。1 event = 1 line。
{"ts":"...","event":"file.write","task_id":"...","path":"...","before_sha256":"...","after_sha256":"..."}
{"ts":"...","event":"policy.deny","task_id":"...","kind":"network","target":"example.com:443","reason":"not_allowlisted"}
```
-最低event集合: `task.start`, `task.end`, `tool.call`, `process.start`, `process.exit`, `file.write`, `file.delete`, `policy.deny`, `network.rule.apply`, `network.rule.remove`, `recovery.start`, `recovery.end`.
+最低event集合: `task.start`, `task.end`, `tool.call`, `process.start`, `process.exit`, `file.write`, `file.delete`, `policy.deny`, `network.rule.apply`, `network.rule.remove`, `recovery.start`, `recovery.end`。各eventは可能な限りsession ID、task ID、内部error codeを持つ。
---
## 16. Recovery・終了設計
### 16.1 graceful stop
@@ -727,7 +735,7 @@ errorは内部codeとlocalized messageを分離し、ログ/auditにはcode、MC
## 22. Codex実装制約
- 新規NuGet dependencyを勝手に追加しない。追加時は標準ライブラリで不能な理由を示す。
- MCP Toolを `agent_run` / `agent_status` 以外に増やさない。
-- Internal ToolをOSコマンド名ごとに増やさず、定義済み6群に収める。
+- Internal ToolをOSコマンド名ごとに増やさず、本章のTool catalogとschemaを変更管理の単位にする。
- Legacy HTTP+SSE transport、WebSocket、独自transportを追加しない。
- Streamable HTTPをnon-loopbackへbind可能にしない。
- 認証/TLSを「便利だから」という理由でv1へ追加しない。
@@ -783,6 +791,11 @@ errorは内部codeとlocalized messageを分離し、ログ/auditにはcode、MC
| mcp.transport | stdio/http |
| mcp.http.host | loopback address only |
| mcp.http.port | listen port |
+| mcp.images.max_count | 画像数上限 |
+| mcp.images.max_bytes_each | 1画像byte上限 |
+| mcp.images.max_total_bytes | request画像合計byte上限 |
+| mcp.tasks.time_to_live_hours | 永続MCP Task保持時間 |
+| mcp.tasks.poll_interval_ms | Task poll間隔 |
| agent.user_system_prompt | 追加prompt path |
| agent.max_iterations | 128 default |
| agent.same_failure_limit | 5 default |
@@ -809,13 +822,14 @@ errorは内部codeとlocalized messageを分離し、ログ/auditにはcode、MC
| localization.fallback | en |
| skills.directory | Skill directory |
| logging.directory | log directory |
+| logging.level | Application log閾値 |
+| logging.http_requests | HTTP request log有効化 |
+| logging.max_file_bytes | rotation size |
+| logging.retained_files | rotation保持数 |
| limits.whole_read_bytes | whole read上限 |
| limits.search_max_results | search結果上限 |
| limits.tail_max_lines | tail行数上限 |
| limits.context_summary_ratio | context要約開始比率 |
-| mcp.images.max_count | 画像数上限 |
-| mcp.images.max_bytes_each | 1画像byte上限 |
-| mcp.images.max_total_bytes | request画像合計byte上限 |
## 28. 主要データ型索引
- `AgentSession`
- `AgentTask`