Why My Internal Prompts Are All in English
Machine prompts on my cron pipeline moved to English for one reason: one control variable across a router of very different models.
Tonight one of my automation chats did something embarrassing. I asked for an English draft of an article. The instructions had the language requirement in them, buried mid-prompt. What came back was Indonesian. Not a translation layer, not a mix. Fully Indonesian prose. I moved that rule to the first line of a fresh chat and the same model complied instantly. Nothing else changed.
That single round trip is why every machine-facing prompt in my setup is now written in English. Not the prompts I type into a chat window for myself. The ones a cron job sends at 2 AM: article pipelines, agent delegation, tool templates. Instructions that get executed while I sleep, by whichever cheap model a router happens to pick.
The assumption that did not survive contact
I used to treat prompt language as a style choice. Big models understand everything, right? The vendors themselves will tell you to think again. Anthropic publishes zero-shot chain-of-thought scores per language, relative to English fixed at 100%. Indonesian lands at 97.3% on Sonnet 4.5 and 94.2% on Haiku 4.5 [1]. Read those numbers as a relative gap, not a grade. A small drop on a frontier model becomes a wider one as you slide down the price curve, and cheap models are exactly what automation pipelines consume by the thousands of calls.
The more useful part of that same document is not the benchmark. It is the guidance: Claude will infer a response language from context, but production applications should state the target language explicitly, and the most reliable place is the system prompt [1]. Vendors never banned local-language prompts. They ask for explicitness in the right place. My reading: if output language needs explicit pinning, instruction language deserves the same treatment.
Instruction language and output language are different variables
Here is the confusion I keep running into, including in my own configs. Casual chats are free-for-all. I type Indonesian, the model answers Indonesian, and if it stumbles I correct it in the next turn. A cron job has no next turn. Nobody is watching, and the model behind the router label can change between runs. OpenAI's own documentation calls model output non-deterministic and recommends pinning model snapshots plus building evaluations to monitor prompt behavior across iterations [2]. If my prompts drift between languages, whatever I am measuring in those evals has two variables changing at once.
Google adds another angle in its prompting guide: clear, specific instructions are the most effective way to steer a model, and instructions written in natural language can be hard to get right, leaving plenty of room for the model's own interpretation [3]. Their context is structured output, but the lesson transfers. Every unit of ambiguity you add is a place for a silent pipeline failure to live.
So my opinion here is firm: prompts are infrastructure, and English is my control variable. Not because English is superior. Because it is the one language every model in my rotation, from frontier to bargain bin, has seen the most of during training, and holding it constant means the model is the only thing that varies.
Enforcement, not vibes
A rule nobody enforces is a wish. My config now has two clauses. First, all internal prompts must be English: cron, delegation, tool templates. Second, when an older non-English prompt turns up, it gets converted first, preserving its meaning and its output-language instruction. Running it as-is is not allowed, even when it looks obvious. The failure mode this prevents is expensive precisely because it is silent: a mistranslated nuance does not raise an error, it just reroutes the whole pipeline.
What stays Indonesian is everything aimed at humans. Replies to users, Indonesian articles, summaries that follow the article's locale. Each of those is pinned explicitly at the end of the English prompt: respond in Indonesian. Instruction language locked, output language declared. Two variables, two places to set them, zero guessing.
Tonight's wrong-language draft cost me one chat round trip and this article. The decision it produced: the English-only rule now covers every profile I run, and any straggler prompt gets translated before it executes, not after it misfires.