From 24d8db0064d92e7ac783d2a3d23d49f314037600 Mon Sep 17 00:00:00 2001 From: tanaka takashi Date: Tue, 11 Aug 2026 22:07:37 +0900 Subject: Retain original task constraints during execution --- doc/Design.md | 5 +++-- src/Agent.Core/Prompts/PromptComposer.cs | 2 ++ src/Agent.Core/Runtime/AgentRuntime.cs | 1 + tests/Agent.Core.Tests/PromptAndRuntimeTests.cs | 3 ++- 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 ExecutionResults, IReadOnlyList Conversation, + string OriginalRequest, string Request, bool RequiresExternalEffect, IReadOnlyList? 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); -- cgit v1.2.3