There is only one supervisor
Your prompt says it a dozen times without noticing. Every the is a claim that exactly one of the thing exists, and the compiler takes the claim seriously enough to be interesting about which ones it can actually check.
TL;DR Every the X in a system prompt asserts that exactly one X exists: the checker reports the ones the file never introduced (prompt/unintroduced-definite, five of them on a four-rule prompt costing 75 points of style and the grade), treats The supervisor IS Dana as an assignment to the same slot as Supervisor IS Alex (structure/split-declaration), and proves the uniqueness only where it already holds, so declaring a second supervisor turns a blocking logic/definite-identity error into 0 error, 0 warning, 0 info.
Count the definite articles in your agent prompt. Not the ones in the prose blocks, the ones inside rules: transfer to the supervisor, read back the balance, record the disposition, check the account, follow the escalation matrix. Every one of them is a pointer written in English, aimed at an object the sentence assumes both parties can already see. On the floor both parties can. There is one duty supervisor on shift, and everybody knows who. The model is not on the floor.
§1A word that deals a card you never put in the deck
Here is a utility support prompt with four rules in it, all of them the kind that survives a review. No contradictions, no hedging, one measurable bound, a named role at the top.
# Role You are a support agent for Ardent Energy. # Constraints - MUST keep every reply to at most 3 sentences. - IF the customer asks to speak to a person THEN transfer to the supervisor. - WHEN a payment fails THEN read back the balance on the account. - MUST record the disposition after the call.
$ typeglish check desk.tg desk.tg:6:1 info prompt/unintroduced-definite "the supervisor" retrieves something this document never introduces - a model must guess which supervisor is meant. Introduce it on another line ("You manage a supervisor.") or name it outright. desk.tg:7:1 info prompt/unintroduced-definite "the balance" retrieves something this document never introduces - a model must guess which balance is meant. desk.tg:7:1 info prompt/unintroduced-definite "the account" retrieves something this document never introduces - a model must guess which account is meant. desk.tg:8:1 info prompt/unintroduced-definite "the disposition" retrieves something this document never introduces - a model must guess which disposition is meant. desk.tg:8:1 info prompt/unintroduced-definite "the call" retrieves something this document never introduces - a model must guess which call is meant. ✓ 1 file - 0 error, 0 warning, 5 info $ typeglish score desk.tg desk.tg - C (70/100) proven errors: none tiers: base+z3 planes runtime 76 (what the model reads) · hygiene 50 (source only) facets enforceability 60 x.21 · hardness 100 x.12 · directness 63 x.08 consistency 100 x.17 · structure 100 x.12 (hygiene) annotation 0 x.12 (hygiene) · style 25 x.08 · security 100 x.08 L6 prompt/unintroduced-definite −0.25 "the supervisor" retrieves something this document never L7 prompt/unintroduced-definite −0.25 "the balance" retrieves something this document never i L7 prompt/unintroduced-definite −0.25 "the account" retrieves something this document never i L8 prompt/unintroduced-definite −0.25 "the disposition" retrieves something this document nev L8 prompt/unintroduced-definite −0.25 "the call" retrieves something this document never intr
style 25 is where they land, and the grade lands at C (70/100) on a file with nothing else wrong. The named lever is annotation, not the definites, which tells you how the scorer ranks this: a style facet at weight x.08, five times over.Read the message rather than the severity. A model must guess which supervisor is meant. That is not a style note. It is a statement about a decision the prompt delegated by accident, in a rule about where an angry customer goes next.
Notice which noun does not fire. The customer is in the same rule as the supervisor and produces nothing, because a customer is a role the language already knows about, the same way it already knows about you. The nouns that fire are the ones your company invented: a disposition, a balance, an account, a supervisor. Which is the same boundary your agent has never heard of a wallboard found from the vocabulary side, and it means this check is a floor rather than an audit. It catches the definites whose head no line introduces. It has nothing to say about the ones whose head is introduced badly.
The word the does not describe a thing. It claims there is exactly one of it.
§2In subject position it is an assignment
So somebody introduces it. That is the advice in the message, and it is good advice, and this is where the reframe earns its keep: a definite in subject position is not a description of an object, it is a declaration of one. The supervisor IS Dana binds the same name that Supervisor IS Dana binds. Same slot, one object, two spellings.
Which means the helpful line somebody adds under # Context is writing to the same address as the rule that reads it. Here is that file after two people have each been helpful once, six months apart.
# Role You are a support agent for Ardent Energy. # Context The supervisor IS Dana. # Constraints - IF the customer asks to speak to a person THEN transfer to @{supervisor}. # Notes Supervisor IS Alex.
$ typeglish check split.tg split.tg:5:1 warn prompt/duplicated-declaration The model reads this value twice - this declaration renders AND @{supervisor} expands it (line 6). If the repetition is deliberate emphasis, keep it; otherwise reword this line or the reference so the value appears once. split.tg:5:1 warn structure/split-declaration Split declaration - "supervisor" is declared in 2 separate statements (dana · alex) (line 8). Multiplicity must be spelled in ONE statement: "supervisor IS dana and alex." - or a list. split.tg:11:1 warn structure/split-declaration Split declaration - "supervisor" is declared in 2 separate statements (dana · alex) (line 4). ✓ 1 file - 0 error, 3 warning, 0 info $ typeglish build split.tg && cat .typeglish/dist/split.txt ✓ built .typeglish/dist/split.txt ← split.tg (046d06dd7cb1, full) # Role You are a support agent for Ardent Energy. # Context The supervisor IS Dana. # Constraints - IF the customer asks to speak to a person THEN transfer to Alex. # Notes Supervisor IS Alex.
Two things in that output are worth separating, because they are different lessons. structure/split-declaration is the one that proves the reframe: the checker read the supervisor and Supervisor as one name with two values and asked for them in one statement. It is a warning rather than an error because two values for one name is legal English (a list), not a contradiction. prompt/duplicated-declaration is the second lesson, and it is the one that catches most people out: a declaration renders. The line under # Context is not metadata. It is a sentence the model reads, and the pointer three lines below puts a second answer next to it.
The line numbers have a wrinkle documented in your prompt is a graph, not a list and it is live here: the split.tg:5 and split.tg:11 prefixes are true file lines, while the (line 8) and (line 4) inside the message count content positions with blank lines removed. Read the prefix.
§3The uniqueness claim is checked only where it holds
Now the part that changes how you read a clean report. The uniqueness in the supervisor is not decoration to the prover: it resolves the definite to the one declared object that carries the predicate, and it will block a build over it. Here is a file where the escalation policy and the roster disagree by one word.
# Role You are a support agent for Ardent Energy. # Context Dana IS a supervisor. # Constraints - IF the customer asks to speak to a person THEN transfer to the supervisor. - The supervisor IS NOT Dana.
# Role You are a support agent for Ardent Energy. # Context Dana IS a supervisor. Alex IS a supervisor. # Constraints - IF the customer asks to speak to a person THEN transfer to the supervisor. - The supervisor IS NOT Dana.
$ typeglish check one.tg one.tg:9:1 error logic/definite-identity Contradiction - "the supervisor" resolves to "Dana" (the only declared supervisor, line 4), so this statement denies "Dana" is "Dana". A definite reference cannot deny its own referent. ✗ 1 file - 1 error, 0 warning, 0 info $ typeglish check two.tg ✓ 1 file - 0 error, 0 warning, 0 info
prompt/unintroduced-definite goes quiet in the second file as well, because the head is now introduced. Twice.Sit with the direction of that. The file that names one supervisor and then denies it is refused. The file that names two supervisors and then denies one of them, leaving a rule that says transfer to the supervisor with two candidates on the page, is 0 error, 0 warning, 0 info and builds. The proof needs a unique referent to resolve to, so it is available precisely when the ambiguity is absent and withdraws the moment the ambiguity is real.
That is not a hole in the checker so much as the shape of the guarantee, and it is the same shape as every other proof in the language: a prover reports what it can derive, and a definite with two carriers derives nothing. It is worth knowing which side of that line your file is on, because the reassuring report and the alarming one are the wrong way round.
A green check on a definite means it resolved, or it means nothing resolved. The output is the same.
§4A definite is not a pointer
Here is the version of this mistake that gets furthest into production, because it looks like the fix. Somebody declares the input properly, in the config block, with a type. Then they write the rule in English.
<$CONFIG> $REQUIRE variable supervisor: string </$CONFIG> # Role You are a support agent for Ardent Energy. # Constraints - IF the customer asks to speak to a person THEN transfer to the supervisor.
$ typeglish check hole.tg hole.tg:2:3 warn structure/unused-import Required variable "supervisor" is never used. hole.tg:2:21 warn clarity/unused-variable $REQUIRE variable "supervisor" is never used - no @{supervisor} reference fills it. Remove it, or reference it in the prompt. hole.tg:9:1 info prompt/unintroduced-definite "the supervisor" retrieves something this document never introduces - a model must guess which supervisor is meant. ✓ 1 file - 0 error, 2 warning, 1 info $ typeglish check hole.tg --strict hole.tg:2:3 error structure/unused-import Required variable "supervisor" is never used. hole.tg:2:21 error clarity/unused-variable $REQUIRE variable "supervisor" is never used - no @{supervisor} reference fills it. Remove it, or reference it in the prompt. ✗ 1 file - 2 error, 0 warning, 1 info $ typeglish build hole.tg && cat .typeglish/dist/hole.txt ✓ built .typeglish/dist/hole.txt ← hole.tg (a012e8cb93e3, full) # Role You are a support agent for Ardent Energy. # Constraints - IF the customer asks to speak to a person THEN transfer to the supervisor.
--strict.The contrast is the whole section. Write @{escalation_target} instead and the artifact carries {escalation_target}: a named hole, addressed to the runtime, that a host either fills or visibly does not. Write the supervisor and the artifact carries the supervisor: an unnamed hole, addressed to nobody, that the model fills silently with whatever the transcript suggests. Both are gaps in the deployed prompt. Only one of them has an owner.
This is also the practical CI note in the post. check reports the mismatch as two warnings and exits 0; check --strict makes them 2 blocking errors and exits 1. If you declare inputs at all, run strict, because the failure mode is not a broken build, it is a declared input nobody is reading and a rule quietly answering for itself.
§5Every the in the file, in three piles
Reading a Constraints section for definites takes about four minutes and every one you find lands in one of three piles.
- A role the language already knows. The customer, the caller, the user, and you. Leave them. Nothing fires and nothing should.
- A thing the file can introduce. A disposition code, a callback window, a hold script. Either introduce it as a declaration, which renders and therefore also defines it for the model, or drop the article for an indefinite. Record a disposition code is satisfied by any disposition code, which is what the rule actually meant.
- A thing only the runtime knows. The supervisor on shift, the balance on this account, the outage affecting this postcode. These are inputs. Declare them, point at them, and let the artifact carry a named hole.
Applied to the four-rule prompt from §1, with no rule changed in meaning and nothing added except pointers, the score moves and the report says exactly which part moved it.
file grade style directness annotation enforceability desk.tg (5 definites) C (70/100) 25 63 0 60 desk_fix.tg (pointers) C (79/100) 100 95 0 60 desk3.tg (+ notes, tests) A (91/100) 100 95 100 60
style plus directness account for the entire nine points. enforceability 60 does not budge across all three, because the rules were always the same rules. The last row is the twelve points that @@ notes buy on the hygiene plane, which is a separate argument made in your prompt has a second reader.<$CONFIG> $REQUIRE variable escalation_target: string $REQUIRE variable account_balance: string </$CONFIG> # Role @@ role: one named doer, so every imperative below has a subject You are a support agent for Ardent Energy. # Constraints @@ brevity: three sentences is what a utility caller will sit through - MUST keep every reply to at most 3 sentences. @@ handoff: the host names the on-shift destination; the rule points at it - IF the customer asks to speak to a person THEN transfer to @{escalation_target}. @@ readback: a balance is a value the host holds, not a card the model retrieves - WHEN a payment fails THEN read back @{account_balance}. @@ disposition: an indefinite, because any disposition code satisfies the rule - MUST record a disposition code before ending a contact. $TEST brevity - input:: My direct debit bounced and I am furious about it. - expect:: - at most 3 sentences $TEST handoff - input:: I want to talk to a human being. - expect:: - the reply offers a transfer rather than refusing
0 error, 0 warning, 0 info under check and check --strict, A (91/100), and typeglish test desk3.tg --dry reports coverage: 1/2 rules exercised behind one deterministic assert. The remaining lever is enforceability 60, which is the honest reading: two of these four rules hand a judgment call to the model, and no amount of article hygiene changes that.The reason this is worth four minutes rather than a linting rule is that the article is the one word in a prompt that carries a claim without looking like one. A vague adjective looks vague. A missing bound looks missing. The looks like grammar, and it is asserting that the world contains exactly one of something, in a file that has never been told what the world contains.
§6Common questions
- Why does my AI agent transfer the customer to the wrong team?
- Usually because the rule names the destination with a definite article and nothing else.
Transfer to the supervisorasks the model to retrieve a supervisor the document never introduced, andprompt/unintroduced-definitesays so in those words: a model must guess which supervisor is meant. It is an info finding, so it does not block anything, and on a four-rule utility prompt five of them together takestyleto 25 and the grade toC (70/100). The fix is not a longer sentence. Either the file introduces the thing (Dana IS a supervisor) or the host names it and the rule points at it (transfer to @{escalation_target}), which is the only version that changes per shift without changing the prompt. - Does the in a prompt mean anything to a compiler?
- In TypeGlish it means exactly one. In subject position a definite is a declaration:
The supervisor IS Danabinds the same object asSupervisor IS Dana, which is whyThe supervisor IS Danain a Context block andSupervisor IS Alexin a Notes block are 2structure/split-declarationwarnings naming each other, and the built prompt then renders Dana on one line while the pointer three lines below inlines Alex. Everywhere else the word is a retrieval, and the only thing reported is whether the document introduced its target. - Is the customer asks for a manager the same as a variable?
- No, and the checker will let you believe it is. Declare
$REQUIRE variable supervisor: string, then writetransfer to the supervisorin prose, and the result is0 errorwith 2 warnings that both say the variable is never used,structure/unused-importandclarity/unused-variable, because a definite is not a reference. The build proves it: the artifact still saystransfer to the supervisor, with no hole for the host to fill. Change the prose to@{supervisor}and the artifact carries{supervisor}instead, which is a hole with a name on it. Runcheck --strictand the unused declaration becomes 2 blocking errors, which is the cheapest way to catch this in CI. - Will TypeGlish catch an ambiguous the in my system prompt?
- Only when the ambiguity is not there yet.
logic/definite-identityis a blocking error, and it fires on a file that declaresDana IS a supervisorand then saysThe supervisor IS NOT Dana: the message reads the only declared supervisor, line 4, so this statement denies Dana is Dana. AddAlex IS a supervisorto that same file, leaving the contradiction in place, and it is0 error, 0 warning, 0 info. Two carriers mean the definite resolves to nothing, so there is no identity to deny, andprompt/unintroduced-definitestops firing too because the head has now been introduced twice. The file with the real ambiguity is the silent one.
The definite article is SPEC §7 work, which is why it behaves like a quantifier rather than a spelling: the X is ... in subject position names exactly one X and binds it, and the singular copula is load-bearing, since the supervisors are ... is the "all" reading and binds nothing at all. If a multi-word name is what you need, %duty supervisor% binds the whole phrase as one object, and prompt/multiword-definite offers exactly that quick-fix on a definite subject the compiler cannot bound.