Rewrite: a bloated support prompt, cut to rules that check
This prompt reads perfectly. A new hire would nod along. It also scores a D, because almost nothing in it can be checked. We rewrite it line by line into rules the compiler can hold you to, and watch the score climb.
TL;DR A support prompt that reads perfectly can still score a D, because vague qualities like "be helpful" and "keep it reasonably short" constrain nothing a checker can see. Rewrite each one as a measurable MUST/NEVER rule with a concrete action or bound, and the same prompt moves from D (54) to B (89). Shorter, and stricter.
Here is a support-agent system prompt of the kind that ships every day. It is polite, it is sensible, and every line sounds like advice you would give a good hire. Read it and you will not find a single thing wrong. Run it through the checker and you get a D, because "sounds like good advice" and "is a rule a model can follow" are not the same property. This post is the rewrite: same intent, same length or shorter, but every line turned into something the compiler can actually defend.
§1The prompt that reads fine
This is the honest starting point, typed the way most support prompts actually get written: a role line and a bulleted list of good intentions.
# Role You are a friendly and helpful customer support agent. # Guidelines - You SHOULD always try to be as helpful as you possibly can to every single customer. - At the end of the day, please make sure to keep your responses reasonably short when appropriate. - It is generally considered to be a good idea to remain friendly and professional at all times. - You might want to consider being a little bit more empathetic with customers who seem upset. - Always be sure to provide accurate and correct information to the best of your ability. - In order to be helpful, you should go above and beyond for the customer. - Please do your best to resolve the issue in a timely manner.
support.tg:5:21 info prompt/hedging Hedging - "try to" turns this instruction into a suggestion the model may skip. Commit to a modal. support.tg:6:83 info prompt/vague Vague - "when appropriate" names a judgment call without the criterion to judge by, so nothing can check it. support.tg:8:7 info prompt/hedging Hedging - "might want to" ... support.tg:9:1 warn prompt/unmeasurable Unmeasurable rule - no observable action or bound, so nothing can check compliance. support.tg:10:3 info style/wordy Wordy - "In order to" can be "to". support.tg:11:10 info prompt/hedging Hedging - "do your best to" ... support.tg:11:44 info prompt/vague Vague - "in a timely manner" ... ✓ 1 file - 0 error, 1 warning, 6 info
§2What the score is measuring
The flags are the symptom; the score is the diagnosis. It is deterministic, and more useful than the letter grade is the single lever it names.
support.tg - D (54/100) proven errors: none tiers: base+z3
planes runtime 56 (what the model reads) · hygiene 50 (source only)
facets enforceability 24 · consistency 100 · style 6 · security 100
lever enforceability 24/100 (up to +20 overall) - Write rules as
MUST / NEVER <verb> with concrete bounds, not vague qualities.
That is the target. Not "add more instructions," not "make it firmer sounding": make each line into something a checker (or a reviewer, or you in three months) can look at a transcript and rule on. A rule you can parse is a rule you can defend.
§3The rewrite, rule by rule
Now the same prompt, same intent, rewritten. "Helpful" gets a scope so it stops being a mood. "Reasonably short" becomes a sentence bound. "Empathetic with upset customers" becomes an ordered action: acknowledge, then fix. "Accurate to the best of your ability" becomes the honest version of that promise: escalate instead of guessing. And each rule carries an @@ note saying why it exists, so the next editor does not delete it by accident.
# Role @@ role: scope "helpful" to a domain so it stops being a mood You are a customer support agent for an online retailer. # Constraints @@ brevity: replies over four sentences get skimmed, not read - MUST reply in at most 4 sentences. @@ greeting: the name confirms we pulled the right account - MUST greet the customer by name in the first message. @@ empathy_first: acknowledging before fixing lowers repeat contacts - WHEN a customer is upset THEN acknowledge the problem before proposing a fix. @@ no_guessing: a wrong policy quote costs more than an escalation - WHEN you are unsure of a policy THEN escalate instead of guessing. @@ refund_guard: a refund without an order number cannot be reconciled - NEVER promise a refund without a confirmed order number.
@@ notes never reach the model; they are there for the humans who edit this next.support.tg - B (89/100) proven errors: none tiers: base+z3
planes runtime 85 (what the model reads) · hygiene 100 (source only)
facets enforceability 60 · consistency 100 · annotation 100 · style 100
lever enforceability 60/100 (up to +11 overall) - Write rules as
MUST / NEVER <verb> with concrete bounds, not vague qualities.
§4What the rewrite bought you
The point was never the score. The score is a proxy for a property you actually want: a prompt where every line pins behavior instead of gesturing at it. Three things changed that a spellcheck never would. Every rule now has one job, so an edit to the refund rule cannot quietly loosen the brevity rule. Every rule is observable, so a bad transcript can be traced to the exact line that failed. And every rule has a @@ note, so the reason it exists survives the next person who thinks it looks redundant.
This is the same loop whether you are writing a returns bot, a triage router, or a voice agent: write the rule, run check, read the lever the score names, and rewrite the vaguest line into the most measurable one you can. It pairs naturally with the eight prompting rules that survive production, and if you would rather build a prompt this way from a blank file than rewrite an old one, the booking-agent walkthrough runs the loop from a one-line brief.
The score command and every diagnostic here (prompt/hedging, prompt/vague, prompt/unmeasurable, style/wordy) shipped in TypeGlish 0.1.0. Both the before and after prompts on this page are re-checked against the real compiler by the CI guard on every build, so the D and the B are facts, not screenshots. Run tg score on your own support prompt and start with whatever the lever line says.
FAQCommon questions
- Why does my support agent ignore half of my system prompt?
- Usually because those instructions are not checkable. A rule like "be helpful" or "keep it reasonably short" names a quality with no observable action or bound, so the model has nothing concrete to comply with and quietly interprets it however the moment suggests. Rewrite each one as a measurable rule ("reply in at most 4 sentences", "escalate when unsure") and the behavior becomes something you can actually hold it to.
- How do I shorten a bloated system prompt without losing behavior?
- Delete the words, not the intent. Most bloat is hedging ("try to", "do your best to"), wordiness ("in order to", "at the end of the day"), and vague qualities ("friendly", "in a timely manner") that constrain nothing. Replace each vague line with one
MUST/NEVERrule that has a concrete action or bound. Seven mood-board lines collapse into five rules that each say exactly one checkable thing, and the prompt gets shorter and stricter at the same time. - What makes a prompt rule measurable?
- A rule is measurable when a reader (or a checker) can look at a reply and decide whether it obeyed. "At most 4 sentences", "greet by name in the first message", and "never promise a refund without a confirmed order number" are all measurable: each names an observable action or a countable bound. "Be concise", "be empathetic", and "when appropriate" are not, because there is no criterion to judge by.
- What is a good TypeGlish score for a system prompt?
- Aim for a B or better. The score is deterministic and names its own biggest lever, so treat it as a gate rather than a grade: run
typeglish scoreon the.tgsource, read the lever line, and fix that facet first. In this rewrite the same prompt moved fromD (54/100)toB (89/100); the remaining lever was enforceability, because a couple of rules still lean on judgment the checker cannot fully see into.