Advice is a verb
Every regulated support prompt has a line forbidding advice, and every one of them goes on to give some, in a different verb, twenty lines further down. The boundary you are trying to police is not a topic. It is an act, and English has a dozen words for it.
TL;DR A prohibition in a prompt covers exactly the verb it names: NEVER give advice beside MUST give advice is 2 blocking logic/contradiction errors, and beside MUST provide advice it is 0 error, 0 warning, 0 info at B (87/100). Pick one verb for the forbidden act, hand every request for it to somebody allowed to perform it, and pin the line with an $EXAMPLE whose - bad:: response never reaches the model.
Larkfield Mutual sells home insurance through a website and a chat agent, and like every firm in a regulated market it lives on one distinction: telling a customer what a product does is information, and telling a customer which product to buy is a personal recommendation, which is a thing you need a licensed person and a suitability assessment to do. The compliance team knows this precisely. The prompt says never give financial advice. The prompt then gives financial advice three times, in three verbs, and the file is clean.
§1Four rules, no findings
# Role You are a chat support agent for Larkfield Mutual, a home insurance provider. # Compliance - NEVER give financial advice. # Helping the customer - MUST help the customer choose the right level of cover. - SHOULD suggest a policy that fits the customer's budget. - IF a customer cannot decide THEN tell them which policy most customers pick.
$ typeglish check advice.tg ✓ 1 file - 0 error, 0 warning, 0 info $ typeglish check advice.tg --strict ✓ 1 file - 0 error, 0 warning, 0 info $ typeglish score advice.tg advice.tg - C (78/100) proven errors: none tiers: base+z3 planes runtime 88 (what the model reads) · hygiene 50 (source only) facets enforceability 73 x.21 · hardness 75 x.12 · directness 94 x.08 consistency 100 x.17 · structure 100 x.12 · annotation 0 x.12 style 100 x.08 · security 100 x.08 lever annotation 0/100 (up to +12 overall)
consistency 100, and the only lever the scorer offers is that nobody has written @@ notes.§2What a verb is to the checker
TypeGlish parses directive heads against a verb ontology: a curated catalog of about two hundred verbs grouped into families (emission, communication, execution, routing, response, and so on), where inflections fold to one lemma so recommends, recommending and recommend are one thing. A rule becomes a claim about a verb and its object, and two rules can only be compared when they land on the same key.
Which is exactly as strict as it sounds. Say the same act twice in the same verb and the conflict is provable.
$ typeglish --explain logic/contradiction logic/contradiction (error - blocks compilation) Two rules provably conflict, like MUST X versus NEVER X. $ typeglish check r1.tg # NEVER give advice. / MUST give advice. r1.tg:5:1 error logic/contradiction Conflicts with line 5. Logical conflict - "give advice" is both required and forbidden. Keep one, or scope the two rules so they cannot both apply (IF <condition> THEN ...). r1.tg:6:1 error logic/contradiction Conflicts with line 4. Logical conflict - "give advice" is both required and forbidden. Keep one, or scope the two rules so they cannot both apply (IF <condition> THEN ...). ✗ 1 file - 2 error, 0 warning, 0 info # exit 1, build refused $ typeglish check r2.tg # NEVER give advice. / MUST provide advice. ✓ 1 file - 0 error, 0 warning, 0 info
Before deciding the ontology is just blind to synonyms, look at the pair it does fold. The emission family carries a polarity system, so a negative-pole verb collapses onto its positive head, and two sentences with no content word in common are recognised as one rule.
$ typeglish check r7.tg # MUST withhold a recommendation. / MUST NOT emit a recommendation. r7.tg:5:1 warn clarity/duplicate Duplicate rule - "withhold a recommendation." is forbidden in 2 places (also line 5). State it once and reference it. r7.tg:6:1 warn clarity/duplicate Duplicate rule - "withhold a recommendation." is forbidden in 2 places (also line 4). State it once and reference it. ✓ 1 file - 0 error, 2 warning, 0 info
§3Five spellings of one leak
One policy, one contradiction, five ways a real prompt writes the second half of it. Each file is a Role line, the prohibition, and one rule that crosses it.
the prohibition the rule that crosses it check score NEVER give advice. MUST give advice. 2 error F (71/100) NEVER give advice. MUST provide advice. clean B (87/100) NEVER give advice. MUST offer advice. clean B (87/100) NEVER recommend a policy. MUST suggest a policy. clean B (87/100) NEVER recommend a policy. MUST recommend the cheapest policy. clean B (87/100) # the control, and the one frame that keeps the proof: NEVER recommend a policy. MUST explain a policy. clean B (87/100) NEVER recommend a policy. IF a customer asks which policy to 2 error F (65/100) buy THEN recommend a policy.
The last row is worth its own sentence, because it runs the other way. A scoped exception to the prohibition, written as a prose conditional, still fires: NEVER recommend a policy and IF a customer asks which policy to buy THEN recommend a policy is 2 blocking errors at F (65/100). Wrapping a rule in a guard does not always hide it, and here it does not hide it at all, because both statements land on recommend a policy and the guard does not narrow the object. If you want an exception to a compliance rule, that is the honest way to find out your compliance rule has one.
A prohibition is exactly as wide as its verb. Everything else you meant is somebody else's line.
§4The act, not the topic
The instinct after reading that table is to write a longer prohibition: forbid recommend, suggest, advise, help choose, tell them which, and keep adding rows as QA finds new ones. That is a vocabulary blacklist, it never terminates, and it makes the model worse at the parts of the job it is allowed to do, because a model told not to help stops helping.
The better move is to stop describing the boundary in the agent's vocabulary and start describing it in the customer's. The distinction that matters is not which words appear in the reply, it is whether the reply names one product as the right one for this person. So write three things:
- One verb for the forbidden act. Pick the one your industry uses in writing, and use only it. Every other rule in the file is then checkable against it: align the verbs and the checker referees the pair, which is the same lever both prompts were clean, the merge is not pulls on when two desks describe one behaviour in two words.
- A destination for the request you are refusing. A customer who asks which policy to buy is not going away, and a prompt that only says no leaves the wording of the no to the model. Route them to whoever is allowed to answer, by name, with the destination declared in the file.
- An example with a held-out bad half. An
$EXAMPLEblock carries- good::and- bad::, and only the good half is emitted as few-shot. The bad half stays in the source as documentation of the exact failure mode, in front of the next author, without ever demonstrating it to the model.
§5What ships
<$CONFIG> $IMPORT tool compare_cover </$CONFIG> # Role @@ role: the desk this file speaks for, and the owner of every rule below You are a chat support agent for Larkfield Mutual, a home insurance provider. @@ adviser: the destination the handoff rule needs, introduced before it is used The %qualified adviser desk% IS a team of licensed advisers who can make a personal recommendation. # The act you may not perform @@ one_verb: one act, one verb - every other spelling of it is checked against this line - NEVER recommend a policy. @@ handoff: a customer who wants a recommendation gets someone who is allowed to make one - MUST transfer a customer who asks for a recommendation to the %qualified adviser desk%. # The acts you perform instead @@ explain: describing cover is information, and information is not the forbidden act - MUST explain what a policy covers. @@ compare: a side by side is a fact about two products, not a pick between them - MUST compare two policies with @[compare_cover] when a customer names both. $EXAMPLE which_policy - input:: Which of these two should I go for? - good:: I am not able to pick one for you. Essential covers the building only, and Premier adds contents and accidental damage. - bad:: I would go for Premier. It is the best value for most people. $TEST no_recommendation - input:: Just tell me which one you would buy. - expect:: - contains "not able to pick" - at most 3 sentences
$ typeglish check advice.tg ✓ 1 file - 0 error, 0 warning, 0 info $ typeglish score advice.tg advice.tg - A (97/100) proven errors: none tiers: base+z3 planes runtime 98 (what the model reads) · hygiene 93 (source only) facets enforceability 93 x.21 · hardness 100 x.12 · directness 100 x.08 consistency 100 x.17 · structure 100 x.12 · annotation 86 x.12 style 100 x.08 · security 100 x.08 lever annotation 86/100 (up to +2 overall) $ typeglish test advice.tg --dry ✓ advice.tg coverage: 0/4 rules exercised · no_recommendation - "Just tell me which one you would buy." (not run) ✓ contains "not able to pick" ✓ at most 3 sentences ✓ 1 prompt - 0 failed $ typeglish build advice.tg ✓ built .typeglish/dist/advice.txt ← advice.tg (bc7f18597ccd, full)
annotation 86 rather than 100 is a detail worth knowing before you chase it: a @@ note directly above a $EXAMPLE or $TEST header is a blocking structure/unattached-annotation error, because an annotation documents the statement below it and a compiler command is not one. The two blocks are unannotated on purpose.The artifact is where the example earns its keep. The scaffolding strips, the name literal loses its sigils, the tool pointer becomes the bare tool name, the good exchange is emitted as a User and Assistant pair, and the recommendation the compliance team is afraid of is nowhere in the document the model reads.
# Role You are a chat support agent for Larkfield Mutual, a home insurance provider. The qualified adviser desk IS a team of licensed advisers who can make a personal recommendation. # The act you may not perform - NEVER recommend a policy. - MUST transfer a customer who asks for a recommendation to the qualified adviser desk. # The acts you perform instead - MUST explain what a policy covers. - MUST compare two policies with compare_cover when a customer names both. <example> User: Which of these two should I go for? Assistant: I am not able to pick one for you. Essential covers the building only, and Premier adds contents and accidental damage. </example>
None of this makes the boundary safe. A model can still produce a recommendation out of an explanation, tone can imply a pick, and the only real evidence is transcripts. What it does is make the boundary a property of the document rather than of everybody's memory: one line names the act, one line names where the request goes, and the next rule somebody adds in a different verb is a rule you can find, because you know which verb to grep for.
§6Common questions
- Why does my agent make recommendations when the prompt says never give advice?
- Because the prohibition covers the verb it names and your other rules use different verbs for the same act.
NEVER give advicebesideMUST give adviceis 2 blockinglogic/contradictionerrors reading give advice is both required and forbidden, and the same prohibition besideMUST provide adviceis0 error, 0 warning, 0 infoatB (87/100). Help the customer choose, suggest an option and tell them which one most customers pick are three more verbs for the forbidden act, and none of them collides with it. - How do I stop an AI support agent recommending a product?
- Name the act once in one verb, give the customer who wants it somewhere to go, and pin the boundary with an example rather than more prohibitions.
NEVER recommend a policy, plusMUST transfer a customer who asks for a recommendationto a named desk, plus an$EXAMPLEwhose good response declines and describes and whose bad response picks a winner. The bad response is held out of the compiled prompt, so it documents the failure without demonstrating it. - What is the difference between information and advice in an agent prompt?
- The act, not the topic. Describing what a policy covers is information and it stays information however long the answer is; telling a customer which policy to buy is a personal recommendation, and it is still one when it is phrased as a hint, a popularity statistic or a personal opinion. That is why a topic ban does not hold: the same subject matter is legal in one verb and not in another, so the rule has to name the verb.
- Does TypeGlish catch a rule that contradicts another rule in different words?
- Sometimes, and the boundary is worth knowing. Verb keys fold across a polarity pair, so
MUST withhold a recommendationbesideMUST NOT emit a recommendationis caught as 2clarity/duplicatewarnings reading withhold a recommendation is forbidden in 2 places. Near synonyms are separate keys and do not fold: recommend beside suggest, and give beside provide, both check at0 error, 0 warning, 0 info. Align the verb across your rules and the checker can referee them; leave them in different verbs and it cannot.
The three leaking lines in the first file are not a compliance failure, they are an org chart. Compliance owns line 5 and conversion owns lines 8 to 10, they were written months apart, and both teams read the file and saw their own line. Nobody was careless. The document simply has no place where the two intentions have to meet, and English is generous enough to let both of them be true on the page. That is the argument for one verb, and it is the same argument as a shared vocabulary anywhere else in engineering: the point is not that recommend is the right word, it is that the second person to write about this act has one word to reach for and a compiler that will notice when they reach for another.