c70b6779a3
The pinned schemaInstruction said only "Respond with a single JSON object matching this schema", contradicting every role prompt that says to emit via the emit_artifact tool. Two stated channels for one artifact, and the pinned one won. ResponseFormat.Json is built under exactly the condition that offers the tool (an llmEmitted slot — see emitArtifactTool), so the tool is always available wherever this instruction renders, and the kernel prefers it: tool-calling models are more reliable at it and it sidesteps llama.cpp's grammar+tools incompatibility. The instruction now names it, and keeps raw JSON as what to do when told to stop calling tools — which is what the tools-less final pass demands and what the executor already accepts either way (llmArtifactOverride ?: response.text). Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>