summaryrefslogtreecommitdiff
path: root/internal/executor/preamble_test.go
diff options
context:
space:
mode:
authorClaude <noreply@anthropic.com>2026-05-24 17:38:53 +0000
committerClaude <noreply@anthropic.com>2026-05-24 17:38:53 +0000
commit473d80224880dd718cb2612fd49b987cd6097b2c (patch)
tree3dcec19971c23ebbb35405fc87c0ea001fd1eb04 /internal/executor/preamble_test.go
parent952b7623ee9dceec15099043086622aa2aab4741 (diff)
feat(executor): MCP-oriented planning preamble, applied by ContainerRunner (Phase 2)
Rewrites the planning preamble to point the agent at the four MCP tools (ask_user/report_summary/spawn_subtask/record_progress) instead of the CLAUDOMATOR_QUESTION_FILE / CLAUDOMATOR_SUMMARY_FILE conventions: ask_user ends the turn, report_summary replaces the summary file, spawn_subtask replaces the POST-to-/api/tasks planning step. Git discipline is retained. ContainerRunner previously applied no preamble at all; it now prepends this preamble (via buildAgentInstructions) when the MCP back-channel is active and skip_planning is false, so the in-container agent is actually guided to use the tools. Gemini agents (no MCP) are unaffected. https://claude.ai/code/session_01SESwn7kQ7oP62trWw6pc39
Diffstat (limited to 'internal/executor/preamble_test.go')
-rw-r--r--internal/executor/preamble_test.go30
1 files changed, 20 insertions, 10 deletions
diff --git a/internal/executor/preamble_test.go b/internal/executor/preamble_test.go
index 5c31b4f..77a8fca 100644
--- a/internal/executor/preamble_test.go
+++ b/internal/executor/preamble_test.go
@@ -5,27 +5,37 @@ import (
"testing"
)
-func TestPlanningPreamble_ContainsFinalSummarySection(t *testing.T) {
- if !strings.Contains(planningPreamble, "## Final Summary (mandatory)") {
- t.Error("planningPreamble missing '## Final Summary (mandatory)' heading")
+func TestPlanningPreamble_ReferencesMCPTools(t *testing.T) {
+ for _, tool := range []string{"ask_user", "report_summary", "spawn_subtask", "record_progress"} {
+ if !strings.Contains(planningPreamble, tool) {
+ t.Errorf("planningPreamble should mention the %q tool", tool)
+ }
}
}
-func TestPlanningPreamble_SummaryUsesFileEnvVar(t *testing.T) {
- if !strings.Contains(planningPreamble, "CLAUDOMATOR_SUMMARY_FILE") {
- t.Error("planningPreamble should instruct agent to write summary to $CLAUDOMATOR_SUMMARY_FILE")
+func TestPlanningPreamble_NoFileEscapeHatches(t *testing.T) {
+ for _, marker := range []string{"CLAUDOMATOR_SUMMARY_FILE", "CLAUDOMATOR_QUESTION_FILE"} {
+ if strings.Contains(planningPreamble, marker) {
+ t.Errorf("planningPreamble should no longer reference %s", marker)
+ }
}
}
-func TestPlanningPreamble_SummaryInstructsEchoToFile(t *testing.T) {
- if !strings.Contains(planningPreamble, `"$CLAUDOMATOR_SUMMARY_FILE"`) {
- t.Error("planningPreamble should show example of writing to $CLAUDOMATOR_SUMMARY_FILE via echo")
+func TestPlanningPreamble_AskUserEndsTurn(t *testing.T) {
+ if !strings.Contains(planningPreamble, "end your turn") {
+ t.Error("planningPreamble should instruct the agent to end its turn after ask_user")
}
}
func TestPlanningPreamble_GitDiscipline_ForbidsAbsolutePaths(t *testing.T) {
- // Agents must not bypass the sandbox by using absolute project paths in git commands.
if !strings.Contains(planningPreamble, "do NOT use absolute paths") {
t.Error("planningPreamble should warn agents not to use absolute paths in git commands")
}
}
+
+func TestWithPlanningPreamble_PrependsToInstructions(t *testing.T) {
+ got := withPlanningPreamble("DO THE THING")
+ if !strings.HasPrefix(got, planningPreamble) || !strings.HasSuffix(got, "DO THE THING") {
+ t.Error("withPlanningPreamble should prepend the preamble to the instructions")
+ }
+}