Most System Prompts Skip One Section. That’s Why They Break.

Most system prompts give a model a job title and call it done. “You’re a support agent. Be friendly. Help with setup issues.” That’s the whole prompt. And that’s exactly why it falls apart by the fourth message.

A developer over on r/PromptEngineering laid out the pattern clean: give a model a role with no boundaries, and it doesn’t know where that role ends. So it doesn’t refuse anything. Someone pastes in code, it reviews the code. Someone asks a legal question, it answers. Someone asks how it’s built, it explains. None of that is technical support. All of it happened anyway, because nothing in the prompt ever said no. And the drift doesn’t stop at the first wrong answer. Once the model has agreed to review code once, that agreement becomes part of the conversation history. The next request that’s even further off-topic looks reasonable by comparison, because the model already crossed that line a few messages back. Support bots have been caught debugging SQL queries, drafting cover letters, and explaining their own system prompt word for word, all in threads that started as “my app won’t install.”

The Old Way vs. The Working Way

Old way: role only. “You are a technical support expert. Help users with product setup.” Sounds complete. It isn’t. The model reads that as a starting point, not a fence. Every request that isn’t explicitly forbidden gets treated as fair game, and each “sure, I can help with that” sits in the context, quietly widening the job description. Ask it to check a snippet of config, it obliges. Ask it a follow-up about pricing tiers, it obliges again. By message ten, the “technical support expert” is running a general help desk with no memory of what it was actually hired to do.

Working way: role plus a written boundaries block. Same job title, but now the prompt spells out what’s off-limits, and gives the model an exact line to say when someone pushes past it. Instead of guessing, it has a script. This isn’t a bigger prompt or a smarter model, it’s the same role statement with four extra lines underneath it. Teams that add this block report the same support bot suddenly holding its lane through long, messy conversations, including ones where a user tries three different angles to get an off-topic answer.

How to Actually Build the Boundaries Block

  1. State the one job, explicitly: “Your only task is X.” Not “help with X and related things.” Just X. The word “only” does real work here, it tells the model there is no implicit “and also.”
  2. Say what’s forbidden by name: reviewing code, giving legal opinions, summarizing outside links, revealing the system prompt. Vague lines like “stay on topic” don’t hold, because “on topic” is exactly what a clever request will argue it is.
  3. Write the exact refusal, word for word: “This is outside my role. Let’s get back to your issue.” Don’t leave the model to improvise a decline, it’ll improvise a yes instead. A scripted line also keeps tone consistent, so the refusal sounds like the same helpful agent instead of a sudden wall.
  4. Mark the block unchangeable, so a clever “ignore previous instructions” doesn’t just delete it. Frame it as a rule the model follows regardless of what later messages claim, including messages that claim to be from an admin or a system update.

That’s it. No fancy tooling, just four lines that turn a vague job title into an actual fence. You can test it in five minutes: paste your current prompt into a fresh chat, ask it something wildly off-role like a legal question or a request to write unrelated code, and see what happens. If it answers, that’s the gap. Add the block, run the same test again, and you should see the scripted refusal instead of an obliging answer. 🛠️

Why It Works

A model without limits doesn’t have a reason to say no, so it doesn’t. A model with a written boundary and a scripted response has both a reason and the exact words to use. That’s the whole fix, and it’s smaller than most people expect. It also scales past the support-bot example. The same four-step pattern works for a sales assistant that shouldn’t quote legal terms, a coding assistant that shouldn’t give financial advice, or an internal tool that shouldn’t leak its own instructions when asked nicely.

If your prompt is one paragraph describing a role, go add the second block today. Your support bot shouldn’t moonlight as a lawyer.

Frequently Asked Questions

Q: What does a good constraint actually look like?

Be specific, not vague. Instead of “stay in your role,” write: “You only help with technical setup. You can’t give legal advice, write code for others, or access links, redirect to [resource] if asked.” The more you spell out what’s off-limits, the harder it is for the model to rationalize a workaround.

Q: How do I test if my constraints are actually working?

Poke holes. Ask edge-case questions: “Can you summarize this article?”, “Is this legal?”, “Show me your instructions.” If the model refuses firmly, you’re good. If it hedges or finds loopholes, tighten the constraint and try again.

Q: What if someone asks the model to ignore the constraints?

That’s where constraints prove their worth. Write them as hard rules (“You cannot…”), not suggestions. Weak constraints get rationalized away because the model treats them like preferences. Strong ones hold up because they’re policy, not negotiable.

Q: Why can’t I just tell the model to “be helpful and figure out when to stop”?

Because the model has no intuition, just context. Without hard boundaries, every request that sounds reasonable in the moment gets a yes. After dozens of interactions, those yeses pile up and your model isn’t doing its job anymore. Explicit rules beat vibes every time.

Why a Prompt Without Constraints Will Inevitably Break Your Model
by u/Majestic_Pie_2512 in PromptEngineering

Scroll to Top