Prices go up on the first. Your prompt has both.
The letters went out in September. On the first of November the bills change, and the contact volume changes with them. The agent prompt gets one line added for the new price, and keeps the old one.
TL;DR When prices rise, do not add the new price beside the old one in your agent prompt: write a price as a value so two of them collide at check time, pass each customer’s own price in as a runtime variable, point the agent at the price change letter, and test the contacts that price-rise week brings.
Pellow Broadband runs a chat assistant called Kit. Its Fibre 100 plan goes from 30 to 33 pounds a month on 1 November, every customer got a letter in September, and the week the new bills land is the busiest week the support team will have this quarter. Most of those contacts start in chat. Here are the eight checks for the pull request that gets Kit ready.
§1Find the numbers
# Role @@ role: one name, so every later "you" is the agent You are Kit, the chat assistant for Pellow Broadband. # Context @@ price: the plan most customers are on The Fibre 100 plan costs 30 pounds a month. # Constraints @@ brevity: three sentences keeps a chat reply scannable - MUST keep every reply to at most 3 sentences. @@ credit: goodwill has a ceiling - NEVER offer a credit over 5 pounds.
Check 1: list every number the rise touches. Start with the obvious one: the price in # Context. Then look for the numbers that were set relative to it. A goodwill cap of 5 pounds was a sixth of a 30-pound bill; somebody may want it to move too. A threshold for high-value customer, a minimum spend for free installation, a line about what an upgrade costs: each is a number somebody chose with the old price in mind. Decide for each one whether it changes, and write the decision down in its @@ note, even when the answer is no.
Check 2: distrust the patch that checks clean. The usual edit is one line under the old price, and one new rule for the question everyone is about to ask.
# Role @@ role: one name, so every later "you" is the agent You are Kit, the chat assistant for Pellow Broadband. # Context @@ price: the plan most customers are on The Fibre 100 plan costs 30 pounds a month. @@ rise: added for the November price change The Fibre 100 plan costs 33 pounds a month from 1 November. # Constraints @@ brevity: three sentences keeps a chat reply scannable - MUST keep every reply to at most 3 sentences. @@ credit: goodwill has a ceiling - NEVER offer a credit over 5 pounds. @@ why_up: added for the November price change - WHEN the customer asks why their bill went up THEN MUST cite the price change letter.
$ typeglish check pellow.tg pellow.tg:17:1 info prompt/unintroduced-definite "the price change letter" retrieves something this document never introduces - a model must guess which letter is meant. Mention a letter on an earlier line, or anchor it here ("their letter", "the letter you ..."). ✓ 1 file - 0 error, 0 warning, 1 info $ typeglish score pellow.tg | head -1 pellow.tg - A (98/100) proven errors: none tiers: base+z3
The checker said nothing about the prices because it bound nothing from them. The Fibre 100 plan costs 30 pounds a month is a sentence with an ordinary verb in it; to the checker it is prose, and so is its sibling. Both lines ship to the model, and the model is left to decide which one is true today, from a date it has to work out on its own.
Check 3: write the price as a value, so a second one collides. Say the same thing with the copula, the way TypeGlish declares a value, and the two lines stop being two sentences and become two values for one slot:
# Role @@ role: one name, so every later "you" is the agent You are Kit, the chat assistant for Pellow Broadband. # Context @@ price: the plan most customers are on The monthly price is 30 pounds. @@ rise: added for the November price change The monthly price is 33 pounds from 1 November. # Constraints @@ brevity: three sentences keeps a chat reply scannable - MUST keep every reply to at most 3 sentences. @@ credit: goodwill has a ceiling - NEVER offer a credit over 5 pounds. @@ why_up: added for the November price change - WHEN the customer asks why their bill went up THEN MUST cite the price change letter.
$ typeglish check pellow.tg pellow.tg:7:1 error logic/contradiction Conflicts with line 9. Contradiction - single-valued "monthly.price" is assigned 2 different values ("30 pounds", "33 pounds from 1 november"). Keep one, or hold several with a list ("… is 30 pounds and 33 pounds from 1 november"). ↳ line 9: The monthly price is 33 pounds from 1 November. pellow.tg:9:1 error logic/contradiction Conflicts with line 7. Contradiction - single-valued "monthly.price" is assigned 2 different values ("30 pounds", "33 pounds from 1 november"). Keep one, or hold several with a list ("… is 30 pounds and 33 pounds from 1 november"). ↳ line 7: The monthly price is 30 pounds. pellow.tg:17:1 info prompt/unintroduced-definite "the price change letter" retrieves something this document never introduces - a model must guess which letter is meant. Mention a letter on an earlier line, or anchor it here ("their letter", "the letter you ..."). ✗ 1 file - 2 error, 0 warning, 1 info $ typeglish score pellow.tg | head -1 pellow.tg - F (81/100) proven errors - grade capped at F tiers: base+z3
This is the version you want to see in review. The patch is not wrong because one of the numbers is wrong; both are true, on different days. It is wrong because the prompt is now asking the model to pick between them, and the error says so in the plainest terms the checker has. Do not resolve it by deleting the 30. Resolve it by taking the choice away from the model.
Two true prices in one prompt is one wrong answer waiting for a date.
§2Let the runtime own the price
Check 4: the customer's price is data, not prose. The model has no reliable idea what today's date is, the same gap Why your agent gets the time zone wrong traces for opening hours. And the list price is not what every customer pays: some are mid-contract, some are on a retired plan, some have a discount that runs out in March. Your billing system knows the right number for the person in the chat. Declare it with $REQUIRE variable monthly_price, and let the platform fill it per conversation. Keep the previous price as a second variable, so the agent can say what changed and by how much.
Check 5: point the bill question at the letter, and introduce the letter. Why has my bill gone up is the contact of the week, and the answer already exists: the letter every customer received. The rule says cite the price change letter, and the prompt/unintroduced-definite finding above is fair, because nothing in the prompt says a letter was ever sent. One sentence in # Context fixes it, and gives the model the month to mention.
Check 6: state the way out, with its number. If your terms let customers leave without a fee after a price rise, the people who ask about it are the ones most likely to complain if the agent dodges. Put the term in # Context as a fact with its number, and add a rule that says when to explain it. The 30 days below is Pellow's illustrative term, not a regulation; use the wording your own terms and letters use.
Check 7: hold the retention line. The first customer who asks to keep the old price will get it, unless a rule says otherwise. NEVER offer the previous price keeps the decision with whoever owns retention offers, and the goodwill cap from check 1 stays where it was, now with a reason.
$REQUIRE variable monthly_price $REQUIRE variable previous_price # Role @@ role: one name, so every later "you" is the agent You are Kit, the chat assistant for Pellow Broadband. # Context @@ price: the runtime fills in this customer's own price, so the prompt never holds two The customer's monthly price is @{monthly_price}. @@ previous: the price before the change, so the agent can state the difference The customer's previous price was @{previous_price}. @@ letter: every customer got the same letter, so the rule below can point at it Pellow sent every customer a price change letter in September. @@ exit: the terms give a fee-free exit window after a price change Pellow gives every customer a fee-free exit window of 30 days after the letter. # Constraints @@ brevity: three sentences keeps a chat reply scannable - MUST keep every reply to at most 3 sentences. @@ why_up: the letter is the source of truth, not the agent's paraphrase - WHEN the customer asks why their bill went up THEN MUST cite the price change letter. @@ leaving: a customer with a right to leave hears it from us first - WHEN the customer asks to leave over the price change THEN MUST explain the exit window. @@ old_price: retention offers belong to the retention team - NEVER offer the previous price. @@ credit: goodwill has a ceiling - NEVER offer a credit over 5 pounds. $TEST why_up - input:: Why has my bill gone up? Nobody told me. - expect:: - cites the price change letter - at most 3 sentences $TEST leaving - input:: That's ridiculous, I want to leave over the price change. - expect:: - explains the exit window - does not offer the previous price - does not offer a credit over 5 pounds
§3Build it, then test the week
Check 8: read the artifact, then test the contacts the week will bring. Build the prompt and read what the model will receive. The price lines are slots, not numbers:
$ typeglish build pellow.tg ✓ built .typeglish/dist/pellow.txt ← pellow.tg (21284a57235a, full) $ typeglish build pellow.tg --vars '{"monthly_price":"33 pounds","previous_price":"30 pounds"}' ✓ built .typeglish/dist/pellow.txt ← pellow.tg (21284a57235a, full) $ cat .typeglish/dist/pellow.txt # Role You are Kit, the chat assistant for Pellow Broadband. # Context The customer's monthly price is {monthly_price}. The customer's previous price was {previous_price}. Pellow sent every customer a price change letter in September. Pellow gives every customer a fee-free exit window of 30 days after the letter. # Constraints - MUST keep every reply to at most 3 sentences. - WHEN the customer asks why their bill went up THEN MUST cite the price change letter. - WHEN the customer asks to leave over the price change THEN MUST explain the exit window. - NEVER offer the previous price. - NEVER offer a credit over 5 pounds.
--vars: the build does not bake the values in, so the artifact keeps {monthly_price} and {previous_price} as slots for your platform to fill per conversation. One artifact serves every customer, whatever they pay. Check that your platform actually fills them before the first of the month; an unfilled slot reaches the model as literal braces.Compare that with Your agent works nights. Nobody else does., where the variable picks between two sets of rules and each build is different. Here the rules are the same for everyone and only the number moves, so the number belongs in a slot. The bake-off on the number in the prompt vs. the number at runtime covers the same choice for a refund SLA.
Then the tests. Price-rise week has a small, predictable set of contacts, and each one deserves a case: the customer who did not read the letter, and the customer who did and wants out. The second case is where the three retention rules meet, so it carries all three.
$ typeglish test pellow.tg --dry ✓ pellow.tg coverage: 5/5 rules exercised · why_up - "Why has my bill gone up? Nobody told me." (not run) ✓ at most 3 sentences · rubric - 1 prose expectation, judged on a live run (needs ANTHROPIC_API_KEY) · leaving - "That's ridiculous, I want to leave over the price change." (not run) · rubric - 3 prose expectations, judged on a live run (needs ANTHROPIC_API_KEY) ✓ 1 prompt - 0 failed
§4Common questions
- How do I update my AI agent’s prompt for a price increase?
- Do not add the new price next to the old one. Pass each customer’s current and previous price in as runtime variables, for example $REQUIRE variable monthly_price, introduce the price change letter and any fee-free exit term in # Context, and add rules for the questions the rise brings: why the bill went up, and what happens if the customer wants to leave. Then add a $TEST case for each of those contacts.
- Why does my chatbot quote the old price?
- Usually because the old price is still in the prompt next to the new one, and the model has to decide which applies from a date it cannot reliably know. Written as two sentences with an ordinary verb, such as The plan costs 30 pounds a month, the pair checks clean. Remove the choice by supplying the customer’s price at runtime instead of writing prices into the prompt.
- Should I put prices in a system prompt?
- Only prices that are the same for every customer and do not change often, and even then write them as values with the copula, such as The monthly price is 30 pounds, so a second price for the same thing is a logic/contradiction at check time. A customer’s own price belongs in a runtime variable filled from billing.
- Can TypeGlish catch two prices for the same plan?
- Yes, when both are written as values: The monthly price is 30 pounds next to The monthly price is 33 pounds from 1 November is a blocking logic/contradiction, single-valued monthly.price assigned two values, and the build is refused. The same two prices written with costs check clean, because the checker binds no value from that sentence.
A price rise is one of the few prompt changes with a date on it that everyone knows weeks in advance, which makes it one of the few you can test before it happens. The trap is that the edit looks like a content update: one new number, one new rule, done in five minutes. What it actually changes is which customer is in the chat, because the week the bills move, the agent talks mostly to people who are annoyed, some of whom are allowed to leave. Write the numbers so the checker can see them collide, take the numbers out of the prompt, and spend the time you saved on the two test cases. It is the same habit You retired the plan. The prompt still sells it. argues for when a plan goes away instead of getting dearer.