← Tidelines/Deep dives

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.

by TypeGlish team7 min read#deep-dives
One act. Five verbs.

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

advice.tg - the file as it ships✗ 0 error, 0 warning, 0 info
# 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.
Line 5 was written by compliance. Lines 8, 9 and 10 were written by the conversion team, in a different sprint, in the same file. Each of the three is a personal recommendation wearing a different verb, and the last one is the oldest trick in retail: an opinion laundered through a statistic.
tg check, --strict and score - advice.tg✗ consistency 100
$ 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)
Not one finding, in a file whose fifth line forbids the thing its eighth, ninth and tenth lines require. 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.

tg --explain, and the same policy in one verb✗ F (71/100), build refused
$ 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
One word changed, in the direction a human reviewer would call identical, and a refused build becomes a clean one. Give and provide are both emission verbs. They are not the same key.

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.

tg check - the fold that does happen✓ caught 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
Withhold and not emit are the same rule and the checker says so. Recommend and suggest are not, and it says nothing. The folds are the ones a language can prove, not the ones a policy would like, which is the same boundary not approving is not declining works through on the response verbs.

§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.

tg check and score - forbid it, then require it✗ four of five ship
  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.
Row 5 is the one that stings: same verb, same act, and the object narrowed from a policy to the cheapest policy is enough to move it off the key. Row 6 is the control, and it is the rule you want, so the identical verdict on rows 2 to 6 is the problem: the checker rates the compliant file and the four leaking ones the same.

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 $EXAMPLE block 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

advice.tg - one verb, one destination, one example✓ A (97/100)
<$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
tg check, score, test --dry and build - advice.tg after✓ 0 error, 0 warning, 0 info
$ 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.

.typeglish/dist/advice.txt - what the model reads✓ the bad half is held out
# 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>
Four rules, one worked exchange, and no sentence anywhere in it that a model could imitate into a recommendation. I would go for Premier exists only in the source, where the next person to edit this file will read it.

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 advice beside MUST give advice is 2 blocking logic/contradiction errors reading give advice is both required and forbidden, and the same prohibition beside MUST provide advice is 0 error, 0 warning, 0 info at B (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, plus MUST transfer a customer who asks for a recommendation to a named desk, plus an $EXAMPLE whose 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 recommendation beside MUST NOT emit a recommendation is caught as 2 clarity/duplicate warnings 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 at 0 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.
Field note

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.

∿ washed up Sep 14, 2026 ∿