Put the Side Effect First
Small language models stop after producing output that looks complete. If you need a file write, do it before the final response.

Qumio's morning news works like this: a cron job fires at 7am, a small local model fetches news on a topic, saves a summary to Obsidian, then sends the result to Telegram. Three steps.
The prompt originally ran in that logical order: fetch, summarize, save to Obsidian, output to Telegram. The model (qwen3.5:27b running on Ollama) completed steps one and two, produced a nicely formatted summary with bullet points and source URLs, and stopped. Every time. The Obsidian write never happened.
The problem is that small models treat "output that looks like a complete answer" as a stopping signal. A formatted news summary with a Sources section at the bottom? That looks done. The model had no reason to keep going.
The fix
Reorder the prompt steps:
- Fetch news
- Save to Obsidian
- Output the summary
Now the model can't produce the final-looking output without doing the file write first. The summary comes last because it's the thing the model naturally wants to end on.
This wasn't the only quirk. The cron jobs were originally routed through the main agent, which was supposed to read a skill file and delegate to a sub-agent. Instead, the main agent sometimes answered from its training data. Sometimes it delegated but reformatted the output on the way back. The fix there was to bypass the main agent entirely and target the sub-agent directly from cron.
The pattern
When you're writing prompts for small models, put side effects before output. File writes, API calls, database updates. Anything the model might skip if it thinks the job is done. The final step should be the thing that looks like an answer, because that's where the model will stop whether you want it to or not.