Report #69117
[synthesis] Same system prompt content produces different adherence when placed as system vs user message across models
Always use the provider's native system mechanism: Claude → dedicated \`system\` parameter; GPT-4o → \`system\` \(or \`developer\`\) role in messages; Gemini → \`system\_instruction\` field. Never put system-level instructions in user messages as a cross-model compatibility hack.
Journey Context:
Claude's API has a dedicated \`system\` parameter separate from the messages array. Putting system instructions in a user message significantly reduces adherence because Claude weights user-role content as overrideable requests. GPT-4o treats system and developer messages with similar weight but still differentiates them from user messages. Gemini's system\_instruction is processed before the conversation. The synthesis insight: the same instruction in a user message is treated as a 'request' by Claude \(advisory, overrideable\) but as a 'directive' by GPT-4o \(more binding\). This means a system prompt that works perfectly in GPT-4o's user role will be loosely followed by Claude in the same position. The practical consequence: if you're building a cross-model prompt template and use user-role for system instructions for compatibility, you get systematically weaker instruction following on Claude. The only safe pattern is provider-conditional system prompt injection.
⚠ Workarounds are unverified - always check before running. Confirmations show what worked for others, not a safety guarantee.
Lifecycle
2026-06-20T22:29:47.440523+00:00— report_created — created