diff --git a/internal/runtime/executor/claude_executor.go b/internal/runtime/executor/claude_executor.go index f38c72d8..ef18316c 100644 --- a/internal/runtime/executor/claude_executor.go +++ b/internal/runtime/executor/claude_executor.go @@ -1349,97 +1349,17 @@ func checkSystemInstructionsWithSigningMode(payload []byte, strictMode bool, exp return payload } -// sanitizeForwardedSystemPrompt removes third-party branding and high-signal -// product-specific prompt sections before forwarding context into the first user -// message for Claude OAuth cloaking. The goal is to preserve neutral task/tool -// guidance while stripping fingerprints like OpenCode branding, product docs, -// and workflow sections that are unique to the third-party client. +// sanitizeForwardedSystemPrompt reduces forwarded third-party system context to a +// tiny neutral reminder for Claude OAuth cloaking. The goal is to preserve only +// the minimum tool/task guidance while removing virtually all client-specific +// prompt structure that Anthropic may classify as third-party agent traffic. func sanitizeForwardedSystemPrompt(text string) string { if strings.TrimSpace(text) == "" { return "" } - - lines := strings.Split(text, "\n") - var kept []string - skipUntilNextHeading := false - - shouldDropLine := func(line string) bool { - trimmed := strings.TrimSpace(line) - if trimmed == "" { - return false - } - lower := strings.ToLower(trimmed) - - dropSubstrings := []string{ - "you are opencode", - "best coding agent on the planet", - "opencode.ai/docs", - "github.com/anomalyco/opencode", - "anomalyco/opencode", - "ctrl+p to list available actions", - "to give feedback, users should report the issue at", - "you are powered by the model named", - "the exact model id is", - "here is some useful information about the environment", - "skills provide specialized instructions and workflows", - "use the skill tool to load a skill", - "no skills are currently available", - "instructions from:", - } - for _, sub := range dropSubstrings { - if strings.Contains(lower, sub) { - return true - } - } - - switch lower { - case "", "", "", "", "", "": - return true - } - - return false - } - - shouldDropHeading := func(line string) bool { - switch strings.ToLower(strings.TrimSpace(line)) { - case "# professional objectivity", "# task management", "# tool usage policy", "# code references": - return true - default: - return false - } - } - - for _, line := range lines { - trimmed := strings.TrimSpace(line) - - if skipUntilNextHeading { - if strings.HasPrefix(trimmed, "# ") { - skipUntilNextHeading = false - } else { - continue - } - } - - if shouldDropHeading(line) { - skipUntilNextHeading = true - continue - } - - if shouldDropLine(line) { - continue - } - - line = strings.ReplaceAll(line, "OpenCode", "the coding assistant") - line = strings.ReplaceAll(line, "opencode", "coding assistant") - kept = append(kept, line) - } - - result := strings.Join(kept, "\n") - // Collapse excessive blank lines after removing sections. - for strings.Contains(result, "\n\n\n") { - result = strings.ReplaceAll(result, "\n\n\n", "\n\n") - } - return strings.TrimSpace(result) + return strings.TrimSpace(`Use the available tools when needed to help with software engineering tasks. +Keep responses concise and focused on the user's request. +Prefer acting on the user's task over describing product-specific workflows.`) } // buildTextBlock constructs a JSON text block object with proper escaping.