Model-Pinned Prompt is an AI code smell, a sign of trouble in LLM systems, in the Change preventers group. Switching models or versions breaks everything because the prompt relies on the old model's quirks.
A legal assistant has used the same model for a year and a half. The team wants to move to a newer model that is cheaper and more capable. The prompt has passages like these (anonymized):
Think step by step before answering. WRITE YOUR REASONING between<thinking> and </thinking> and only then the answer.NEVER, UNDER ANY CIRCUMSTANCES, omit the jurisdiction clause.Start your answer with exactly "Opinion:" (the parser depends on it).If the answer goes over 800 words, you will be penalized.
With the new model, the reasoning between tags leaks into the final text, the all-caps instructions make the tone far too rigid, and the parser breaks because the answer opens with a sentence before “Opinion:”. The migration, planned for one week, took three.
Each trick compensated for one quirk of the old model. “Think step by step” forced visible reasoning. ALL CAPS and a penalty threat pushed an instruction the old model ignored. The split("Opinion:") parser treated prose as a schema. The new model follows the instruction to the letter, sometimes too much, and the code that expected rigid text breaks.
Signs of a Model-Pinned Prompt:
The prompt has tricks that compensated for an old model’s limitations (reasoning in tags, threats, repeated instructions).
Code depends on the exact text format (“starts with”, “line 2 is the title”).
Nobody knows which instructions are still needed.
Switching models or versions is a project, not an afternoon.
There is no eval that runs on both models and compares them.
flowchart LR
P(["1. Prompt tuned to model A"]):::llm --> A(["2. Model A: works"]):::llm
P --> B(["3. Model B: different behavior"]):::llm
B --> X["4. Parser breaks, tone shifts"]:::tool
The prompt was tuned, over time, to one model’s quirks.
With that model, everything works.
With a new model, the tricks have different effects.
Code that depended on the format breaks, and behavior changes without warning.
Tuning a template to the current model is normal. The smell is when that sheet of tricks is the only way the system works, and nobody can take it off.
Reasons
Trial-and-error tuning. Each problem was solved with whatever trick worked on that model. Nobody deleted the trick when the cause went away.
Format guaranteed by text. Before structured output, the only way was to request a format and hope. The parser was born then and stayed.
New models follow instructions differently. What used to need emphasis is now followed to the letter, sometimes too much. Models with built-in reasoning still obey write your reasoning between tags and duplicate the work in the visible text.
No comparative eval. Nobody measures the prompt on another model until migration day. By then the provider has already announced the snapshot retirement date.
Fear of deleting. “Don’t touch it, it’s in production.” The trick sheet becomes a relic.
Cost of ignoring
Stuck on an old model. The team pays more for a worse model because migrating is risky. When the provider retires the snapshot, migration becomes an emergency.
Forced breakage. Even small version updates change the text enough for the split to fail.
Bloated prompt. Stacked tricks make the system prompt larger, more expensive on every call, and harder to read. See Prompt Bloat.
Tone and policy. Threats and ALL CAPS leak to the user. In a legal opinion, “you will be penalized” should not sit on the path to the jurisdiction clause.
Always, first. An eval that runs on both models and compares by category turns migration into a measured decision. Targets: Eval Harness and Golden Dataset.
The prompt is scattered or unversioned. One template per model, versioned, lets you migrate one route at a time and roll back. Target: Prompt Template Registry.
Eval on the current model, with the categories the parser currently hides (jurisdiction clause present, amount extracted, tone).
A schema instead of split.opinion, forum, risks as fields, not as prose.
Delete tricks (reasoning tags, threats, routine ALL CAPS) on a branch, then measure.
Run the same eval on the new model. Where it drops, make a small versioned tweak, not a new sheet of threats.
Migrate one route at a time, with the old template still published for rollback.
Before and after the prompt, the core that remains:
# afterYou are a legal assistant. Answer in the schema.Always include the jurisdiction clause when the contract has one.Do not invent case law.
Three lines instead of a paragraph of tricks. The schema holds the format. The eval holds the rest.
Payoff
Model migrations in days, with a before and after number.
Shorter prompts, free of inherited tricks.
Code that does not depend on the text’s format.
Freedom to pick the model by cost and quality, not by fear.
When to ignore
The current model is good enough and will not be retired. With no reason to migrate, there is no urgency. Build the eval anyway: the retirement date always arrives.
Throwaway prompts. A one-off script can depend on whatever model is available.
Is it this smell?
Quick answers
What is Model-Pinned Prompt?
Model-Pinned Prompt is an AI code smell, a sign of trouble in LLM systems, in the Change preventers group. Switching models or versions breaks everything because the prompt relies on the old model's quirks.