What changed
Claude Opus 4.8 accepts role: "system" entries immediately after a user turn anywhere in the messages array. Previously, system instructions could only appear in the top-level system field and could not be updated mid-conversation without rebuilding the entire prompt and breaking prompt cache.
TL;DR
You can now append updated system instructions at any point in a long Claude Opus 4.8 conversation by adding {"role": "system", "content": "..."} after a user turn in messages — no beta header required, and the change preserves cache hits on all earlier turns.
Developer signal
The use case is agentic loops where instructions, permissions, or environment state change mid-task. Previously, injecting a permission update required rebuilding from the top-level system field — which invalidated the prompt cache on all prior turns and re-billed cached tokens as uncached input. With mid-conversation system messages, you append the update after the most recent user turn, the cached prefix stays intact, and only the new system entry is billed as new input. The pattern: keep stable, high-level instructions in the top-level system field; use mid-conversation entries for task-scoped updates ("You now have permission to write to /tmp"). Placement rules apply — a system entry must immediately follow a user turn, not an assistant turn. See the docs for the full placement constraint list. This feature is only available on claude-opus-4-8 and later; earlier models, including Opus 4.7, return 400 on mid-conversation system entries. The lower prompt cache minimum on Opus 4.8 (1,024 tokens) means even short mid-conversation system updates can become cacheable if a subsequent identical call repeats them.