summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authortanaka takashi <isazaka@gmail.com>2026-08-11 22:07:37 +0900
committertanaka takashi <isazaka@gmail.com>2026-08-11 22:07:37 +0900
commit24d8db0064d92e7ac783d2a3d23d49f314037600 (patch)
treea9b74dd6a8ba2fd2f2331eaa24375829abedeb5e
parent66701c56acb06c9cb56601f5deb65235f5178071 (diff)
Retain original task constraints during execution
-rw-r--r--doc/Design.md5
-rw-r--r--src/Agent.Core/Prompts/PromptComposer.cs2
-rw-r--r--src/Agent.Core/Runtime/AgentRuntime.cs1
-rw-r--r--tests/Agent.Core.Tests/PromptAndRuntimeTests.cs3
4 files changed, 8 insertions, 3 deletions
diff --git a/doc/Design.md b/doc/Design.md
index dad6692..5cc1480 100644
--- a/doc/Design.md
+++ b/doc/Design.md
@@ -401,8 +401,9 @@ AgentSession
6. current TaskGraph / current Task
7. previous Summary
8. recent verified Execution Result
-9. current Taskの`requires_external_effect`に基づく実行要件
-10. recent Conversation
+9. original MCP Task request(exact path、引数、制約、literalの参照元)
+10. current Taskの`requires_external_effect`に基づく実行要件
+11. recent Conversation
実行要件は、現在runningのTaskだけを実行してqueued Taskを先取りしないことを指示する。外部効果が必要なTaskでは文章上の宣言、計画、JSON例を実行済みと扱わず、対応するInternal Toolを直ちに呼び出すよう指示する。成功済みのread結果はExecution Resultから再利用し、不要な再読込を避けてwrite/processへ進む。外部効果が不要なTaskにはToolを強制しない。未解決のTool失敗後にToolを呼ばない応答も同一失敗として数え、既定の同一失敗上限でfailedにする。
### 9.3 Summary policy
diff --git a/src/Agent.Core/Prompts/PromptComposer.cs b/src/Agent.Core/Prompts/PromptComposer.cs
index de209be..c61e678 100644
--- a/src/Agent.Core/Prompts/PromptComposer.cs
+++ b/src/Agent.Core/Prompts/PromptComposer.cs
@@ -15,6 +15,7 @@ public sealed record PromptContext(
string PreviousSummary,
IReadOnlyList<ExecutionResult> ExecutionResults,
IReadOnlyList<ConversationMessage> Conversation,
+ string OriginalRequest,
string Request,
bool RequiresExternalEffect,
IReadOnlyList<string>? Images = null);
@@ -33,6 +34,7 @@ public static class PromptComposer
new("system", context.TaskGraphSummary),
new("system", context.PreviousSummary),
new("system", ComposeExecutionResults(context.ExecutionResults)),
+ new("system", $"Original MCP Task request (reference for exact paths, arguments, constraints, and literals; perform only the current Running Planner Task):\n{context.OriginalRequest}"),
new("system", ComposeExecutionRequirement(context.RequiresExternalEffect))
};
// Inject selected skill instructions (Progressive Disclosure Stage 3).
diff --git a/src/Agent.Core/Runtime/AgentRuntime.cs b/src/Agent.Core/Runtime/AgentRuntime.cs
index 3722ff3..894f50e 100644
--- a/src/Agent.Core/Runtime/AgentRuntime.cs
+++ b/src/Agent.Core/Runtime/AgentRuntime.cs
@@ -220,6 +220,7 @@ public sealed class AgentRuntime(TaskRegistry registry, IOllamaClient ollama, Ag
session.Summary ?? string.Empty,
session.ExecutionResults,
session.Conversation,
+ task.Request,
plannerTask.Description,
plannerTask.RequiresExternalEffect,
task.Images)).ToList();
diff --git a/tests/Agent.Core.Tests/PromptAndRuntimeTests.cs b/tests/Agent.Core.Tests/PromptAndRuntimeTests.cs
index 910ea2a..acfee81 100644
--- a/tests/Agent.Core.Tests/PromptAndRuntimeTests.cs
+++ b/tests/Agent.Core.Tests/PromptAndRuntimeTests.cs
@@ -22,7 +22,7 @@ public sealed class PromptAndRuntimeTests
"fixed", "user system", "ja", availableSkills, [], "capability", "graph", "summary",
[new ExecutionResult(Guid.NewGuid(), "file_read", true, "verified content")],
[new ConversationMessage("user", "old"), new ConversationMessage("assistant", "reply")],
- "new request", true, ["image"]));
+ "original request with C:/exact/path", "new request", true, ["image"]));
// Check that the skill catalog (name + description) is present, not the full instructions.
Assert.Contains(messages, m => m.Content.Contains("test-skill") && m.Content.Contains("A test skill."));
@@ -31,6 +31,7 @@ public sealed class PromptAndRuntimeTests
Assert.Contains(messages, m => m.Role == "system" && m.Content.Contains("fenced JSON example does not perform", StringComparison.Ordinal));
Assert.Contains(messages, m => m.Role == "system" && m.Content.Contains("do not perform Queued Tasks", StringComparison.Ordinal));
Assert.Contains(messages, m => m.Role == "system" && m.Content.Contains("file_read (success): verified content", StringComparison.Ordinal));
+ Assert.Contains(messages, m => m.Role == "system" && m.Content.Contains("original request with C:/exact/path", StringComparison.Ordinal));
Assert.Equal("system", messages[0].Role);
Assert.Equal("user", messages[^1].Role);
Assert.Equal(["image"], messages[^1].Images);