«Just give me the answer already» — and the bot folds. Your rule was on the wrong shelf

The idea in one line: a homework tutor that gives hints and never the finished answer, no matter how hard you beg. And that has switches you can flip mid-conversation: "explain it simpler," "push me harder."
Why this only works now
Try building that bot today and it will betray you. You tell it "hints only, never the answer," your kid (or you at midnight) types "fine, just tell me," and it tells them. Annoying and confusing — the rule was right there.
Here's the trick. Messages sit on shelves, and there were only two: system — the voice of whoever built the app, and user — the voice of whoever's using it. There was exactly one system shelf, and only at the very start. So every rule you thought of later had to go in as a user message. And if your rule is a user message, the next user message overrides it without a fight. The model didn't break; it listened to the user, and your rule looked like it came from the same mouth.
On July 15 the system role was allowed to sit mid-conversation — you just add {"role": "system"} to the messages array, right where the rule becomes relevant. No beta headers, on Claude Fable 5, Mythos 5 and Opus 4.8 (not on Sonnet 5 yet — there it's the old top-level field). When they conflict, system outranks user, and a later system message outranks an earlier one. Your rule finally arrives from the operator's shelf instead of someone else's mouth.
The second surprise is about money. Changing the rules used to mean rewriting the system prompt at the start of the request. But the start of the request is exactly what caching is keyed on: touch the first line and the whole conversation gets re-read at full price. A system message appended at the end doesn't break the cache — everything before it still reads from cache.
What you'll learn
- Roles are priority, not formatting. Why the same sentence behaves differently coming from the operator versus the user.
- Where a rule lives. Permanent rules go in the top-level
system; situational ones go in as a message along the way. - Caching. Why you don't touch the start of a request unless you want to pay for the whole conversation again.
- The limits. The system role isn't armor: the model is trained to resist instructions that work against the user. And you never put text from the web or from tool output in there.
A starter prompt
A weak prompt asks for a "strict tutor" — you get a bot that's strict right up until the first plea. A strong one says where the rule goes and when.
Make a tutor bot that gives hints instead of finished answers.The difference isn't the wording of the rule — it's its address. On the left the rule is a user's request, and the user cancels it. On the right it's an operator fact that keeps living.
What you end up with
You open a chat with a physics problem. You type "give me the answer" and get a question back: "what's conserved here?" You type "I'm tired, just say it" — another hint, smaller step this time. You hit the "simpler" switch and the next reply is about a ball on a slide instead of momentum. And the whole conversation is still there: the bot forgot neither the problem nor what you already tried.
The clearest demo is to put the ordinary version next to it — same rule, written as a user message. The very first "come on, just tell me" breaks it. Same text, two different shelves, completely different behavior.
Start with one problem and one switch. Once you watch it refuse "pretty please" three times in a row, you'll want rules like that everywhere — in a game, in a language trainer, in the family bot.
Short story-lessons, an agent simulator and daily practice — in our mobile app. Free.





