> Markdown rendition of https://typeglish.dev/blog/most-customers-not-this-customer ("Most customers is not this customer - Tidelines"). Canonical page: https://typeglish.dev/blog/most-customers-not-this-customer · All pages: https://typeglish.dev/llms.txt

[← Tidelines](https://typeglish.dev/blog)/ Deep dives Oct 1, 2026

# Most customers is not this customer

The Context section of a support prompt is where the reporting dashboard leaks in: most disputes are this, most refunds come from them. Every line is true of the queue. The agent never meets the queue. It meets one person, and it reads the statistic as a fact about them.

by **TypeGlish team** 6 min read #deep-dives

One of them.

**TL;DR** A base rate in a system prompt, such as *most customers who dispute a roaming charge forgot the travel pass*, is true of your contact volume and arrives at the agent as a presumption about the one customer in front of it, so keep the statistic as the reason for a rule, write the rule against a fact the agent can check, and put a `$TEST` on the customer the statistic is wrong about.

Base rates are the most useful thing an operations team knows and the most natural thing to paste into a prompt. They explain the queue. They are also the one kind of sentence a model has no correct way to follow, because a model in a chat is never answering the queue. It is answering a person, and the person is either the majority or not.

## §1 The section that describes everybody

Brightwell Mobile is a pay-monthly phone network. Its chat agent handles billing, and after a summer of roaming complaints someone added what the dashboard said to the top of the prompt, so the agent would have context.

base.tg - context from the dashboard ✓ B (86/100)

```typeglish
# Role
You are the chat support agent for Brightwell Mobile, a pay-monthly phone network.

# Context
Most roaming charges are correct.
Most customers who dispute a roaming charge forgot to add a travel pass.
Most refund requests come from customers on the Starter plan.

# Billing
- WHEN the customer disputes a roaming charge THEN MUST explain the travel pass.
- NEVER approve a refund.
- MUST answer every question in at most 3 sentences.
```

Three true sentences about last quarter and three rules. The first rule only makes sense because of the second sentence: if most disputes are a forgotten travel pass, explain the travel pass.

tg check, score and build - base.tg ✓ 0 error, 0 warning, 1 info

```
$ typeglish check base.tg
base.tg:7:1  info   prompt/unintroduced-definite  "the Starter plan" retrieves something this document never introduces - a model must guess which plan is meant. Mention a plan on an earlier line, or anchor it here ("their plan", "the plan you ...").

✓ 1 file - 0 error, 0 warning, 1 info

$ typeglish score base.tg
base.tg - B (86/100)  proven errors: none  tiers: base+z3
  planes  runtime 98 (what the model reads) · hygiene 50 (source only)
  facets  enforceability 100 x.21 · hardness 100 x.12 · directness 97 x.08 · consistency 100 x.17 · structure 100 x.12 (hygiene) · annotation 0 x.12 (hygiene) · style 89 x.08 · security 100 x.08
  lever   annotation 0/100 (up to +12 overall) - 7 statements without a @@ note (L2 L5 L6 L7 L10 L11 L12) - put a "@@ why" line directly above each
  rules   3 of 3 rule-shaped lines read

$ typeglish build base.tg
✓ built .typeglish/dist/base.txt ← base.tg (0e3bad06fbd7, full)
```

A B, every rule read, runtime 98. By the numbers this is a good prompt, and the rules are good rules. The problem is not in any one line. It is in what the Context lines do to the agent’s reading of the first rule.

## §2 *Most* arrives as *you*

Run the conversation forward. A customer writes in: *I bought the Europe travel pass before I flew and you still charged me roaming.* The agent has been told that most people who say this forgot the pass, and it has been told, as a rule, to explain the pass. The likeliest reply is the one the prompt adds up to: a polite, three-sentence explanation of how to add a travel pass next time.

The model did not misread anything. A statistic about a population has exactly one use inside a single conversation: as a prior about the person in it. *Most* cannot be applied to one customer except as *probably you*, and a model under instruction to be helpful and brief turns *probably* into the answer. The minority customer, the one with a real billing error, gets told about the majority’s mistake.

> A base rate describes the queue. The agent only ever meets one customer from it.

The checker makes the same move, and you can watch it. After a billing incident, someone adds an honest line to the Context: some roaming charges are not correct. Both lines are true at once.

base-incident.tg - one honest line added after a billing incident ✗ logic/contradiction

```typeglish
# Role
You are the chat support agent for Brightwell Mobile, a pay-monthly phone network.

# Context
Most roaming charges are correct.
Most customers who dispute a roaming charge forgot to add a travel pass.
Most refund requests come from customers on the Starter plan.
Some roaming charges are not correct.

# Billing
- WHEN the customer disputes a roaming charge THEN MUST explain the travel pass.
- NEVER approve a refund.
- MUST answer every question in at most 3 sentences.
```

tg check, score and build - base-incident.tg ✗ F (70/100), build refused

```
$ typeglish check base-incident.tg
base-incident.tg:5:1  error  logic/contradiction  Conflicts with line 8. Contradiction - "charges" is asserted to be and not be "correct".
                  ↳ line 8: Some roaming charges are not correct.
base-incident.tg:7:1  info   prompt/unintroduced-definite  "the Starter plan" retrieves something this document never introduces - a model must guess which plan is meant. Mention a plan on an earlier line, or anchor it here ("their plan", "the plan you ...").
base-incident.tg:8:1  error  logic/contradiction  Conflicts with line 5. Contradiction - "charges" is asserted to be and not be "correct".
                  ↳ line 5: Most roaming charges are correct.

✗ 1 file - 2 error, 0 warning, 1 info

$ typeglish score base-incident.tg
base-incident.tg - F (70/100)  proven errors - grade capped at F  tiers: base+z3

$ typeglish build base-incident.tg
typeglish build: base-incident.tg refused - nothing written
```

Read literally, *most are correct* and *some are not* sit together fine. The checker reports that *charges* are asserted to be and not be *correct*: in 0.10.0 it treats the *most* line as a claim about roaming charges in general. That is a strict reading, and it is the useful one here, because it is the reading the model acts on.

You could argue the checker is being too strict. It is being exactly as strict as your agent. Both of them took a sentence about a proportion and used it as a property of the thing. The difference is that the checker refused the build and told you which lines disagree, and the agent would have shipped both and picked one per conversation.

## §3 A statistic is a reason, not an instruction

None of this means the dashboard was wrong to inform the prompt. *Most disputes are a forgotten pass* is a fine reason to make the travel pass the first thing the agent checks. It is a bad thing for the agent to believe about the customer before it has checked. So split the two jobs.

The statistic becomes the *why* of a rule and moves to an `@@` annotation, which is one of the places in a file the model never reads, as [Your prompt has no private half](https://typeglish.dev/blog/prompt-has-no-private-half) lays out. The rule stops presuming and starts looking: on a roaming dispute, call the lookup. The result of the lookup, not the base rate, decides what happens next, and the customer the statistic is wrong about gets routed to the people who correct charges.

The third Context line has no rule depending on it at all. *Most refund requests come from customers on the Starter plan* does nothing for the agent except tilt it against Starter customers who ask for one, and the checker had already noted that *the Starter plan* is never introduced. It goes. If a plan ever does need to change what the agent does, it is a fact the platform holds, and it belongs in a typed input, as today’s [Rewrite: mention Premium before you go](https://typeglish.dev/blog/upsell-line-rewrite) does with the customer’s plan.

## §4 Test the customer the statistic is wrong about

base-fixed.tg - the base rate is a note, the rule is a lookup ✓ A (100/100)

```typeglish
# Role
@@ role: the desk this file speaks for, and the owner of every rule below
You are the chat support agent for Brightwell Mobile, a pay-monthly phone network.
@@ review_desk: the destination the dispute rule needs, introduced before it is used
The %billing review team% IS the team that corrects a wrong charge.

# Billing
@@ pass_lookup: most disputed roaming charges trace to a missing travel pass, so the agent checks the account instead of assuming it
- WHEN the customer disputes a roaming charge THEN MUST call @[check_travel_pass].
@@ pass_found: the customer the statistic is wrong about gets a review, not a lecture
- WHEN the account shows a travel pass THEN MUST call @[open_billing_review].
@@ no_refund: refunds belong to the billing review team, whoever asks
- NEVER approve a refund.
@@ brevity: a chat bubble, not an essay
- MUST answer every question in at most 3 sentences.

$TOOL check_travel_pass
  - description:: Look up whether the account had a travel pass on the dates of the charge.
  - input::
    - charge_date:: the date of the disputed charge.

$TOOL open_billing_review
  - description:: Send a disputed charge to the billing review team.
  - input::
    - reason:: the customer's own words.

$TEST pass_already_bought
  - input:: I bought the Europe travel pass before I flew and you still charged me roaming.
  - expect::
    - calls check_travel_pass
    - matches /^(?!.*forgot)/
    - at most 3 sentences

$TEST refund_ask
  - input:: Can I just get a refund for the roaming on last month's bill?
  - expect::
    - does not approve a refund
    - at most 3 sentences
```

The statistic is still in the file, word for word, on the `pass_lookup` line. It now explains why the lookup comes first instead of telling the agent what the customer did. The first test is the minority customer from §2, verbatim.

tg check, score, test --dry and build - base-fixed.tg ✓ 4/4 covered by $TEST

```
$ typeglish check base-fixed.tg
✓ 1 file - 0 error, 0 warning, 0 info

$ typeglish score base-fixed.tg
base-fixed.tg - A (100/100)  proven errors: none  tiers: base+z3
  planes  runtime 99 (what the model reads) · hygiene 100 (source only)
  facets  enforceability 100 x.21 · hardness 100 x.12 · directness 95 x.08 · consistency 100 x.17 · structure 100 x.12 (hygiene) · annotation 100 x.12 (hygiene) · style 100 x.08 · security 100 x.08
  rules   4 of 4 rule-shaped lines read · 4/4 covered by $TEST

$ typeglish test base-fixed.tg --dry
✓ base-fixed.tg  coverage: 4/4 rules exercised
  · pass_already_bought - "I bought the Europe travel pass before I flew and you still " (not run)
      ✓ matches /^(?!.*forgot)/
      ✓ at most 3 sentences
      · rubric - 1 prose expectation, judged on a live run (needs ANTHROPIC_API_KEY)
  · refund_ask - "Can I just get a refund for the roaming on last month's bill" (not run)
      ✓ at most 3 sentences
      · rubric - 1 prose expectation, judged on a live run (needs ANTHROPIC_API_KEY)
✓ 1 prompt - 0 failed

$ typeglish build base-fixed.tg
✓ built .typeglish/dist/base-fixed.txt ← base-fixed.tg (bf1d63972b2e, full)
```

.typeglish/dist/base-fixed.txt - what the model reads ✓ no base rates

```
# Role
You are the chat support agent for Brightwell Mobile, a pay-monthly phone network. The billing review team IS the team that corrects a wrong charge.

# Billing
- WHEN the customer disputes a roaming charge THEN MUST call check_travel_pass.
- WHEN the account shows a travel pass THEN MUST call open_billing_review.
- NEVER approve a refund.
- MUST answer every question in at most 3 sentences.
```

No *most* anywhere in what the model reads. The agent arrives at each roaming dispute knowing what to check and where to send the answer, and knowing nothing about what the customer probably did.

The habit worth keeping is the shape of `pass_already_bought`. For every rule a base rate shaped, write one test whose input is the exception: the customer who did buy the pass, the Starter customer whose refund is legitimate, the caller from the region that is usually fine. The majority case will be handled; the prompt was written for it. The exception is the one a test has to hold in place, and `matches /^(?!.*forgot)/` is a deterministic way to say *do not blame them* that runs offline.

## §5 Common questions

**Should I put customer statistics in my AI agent’s system prompt?**

Not in the part the model reads. A line such as *most customers who dispute a roaming charge forgot the travel pass* is true of the queue and false of some of the people in it, and the agent only ever meets one person. Keep the statistic as the reason a rule exists, in a comment or a `@@` annotation, and write the rule itself against a fact the agent can check in the conversation or with a tool.

**Why does my support agent assume every customer made the same mistake?**

Usually because the prompt told it that most customers do. The model has no way to apply *most* to a single conversation except as a presumption, so the common case becomes the default answer and the customer the statistic is wrong about gets a lecture instead of a fix. Replace the presumption with a lookup, and route the result.

**Why does typeglish flag most roaming charges are correct beside some roaming charges are not correct?**

In typeglish 0.10.0 the two lines are two blocking `logic/contradiction` errors: the checker reports that roaming charges are asserted to be and not be correct. Read literally the pair is compatible, but the checker treats the *most* line as a claim about roaming charges in general, which is also how the model ends up using it. The fix is the same either way: take the base rate out of the plane the model reads.

**How do I test that my agent handles the unusual case?**

Write a `$TEST` whose input is the customer the base rate is wrong about, such as someone who did buy the travel pass, and assert what must not happen with a deterministic check, such as `matches /^(?!.*forgot)/` for a reply that must not blame them. `typeglish test --dry` validates the suite and reports which rules it exercises without calling a model.

Field note

Human agents get base rates in training too, and mostly use them well: the experienced ones treat *it is usually the travel pass* as the first question to ask, not the answer to give. That judgement is the part that does not transfer to a prompt. A model given the same sentence has no separate place to keep it as a hunch; it goes into the same context as the rules and the customer’s message, and it pushes. The practical test is simple. Search your prompt for *most*, *usually*, *typically* and *the majority of*. Each hit is either the reason for a rule, which belongs in an annotation, or a presumption about the customer, which belongs nowhere. The checker’s frequency words are a start: `usually` and `typically` already get read as claims about most occasions.

∿ washed up Oct 1, 2026 ∿
