Teardown: your QA scorecard is not a system prompt
Seven rows out of the quality rubric, pasted under a heading, because the rubric is the one document in the contact centre everybody already agrees on. The checker has seven things to say and none of them blocks, and the three rows that read most like requirements are the three it never saw.
TL;DR A QA scorecard pasted into an agent prompt checks at 0 error, 3 warning, 4 info and scores D (62/100), because a rubric is written in the three grammars a checker cannot prove anything about: questions, past-tense reports, and agentless passives. Against a rule capping greeting at 30 seconds, You MUST greet a caller within 15 seconds is 2 blocking logic/time-strength errors and Did the agent greet the caller within the first 15 seconds? is 0 error, 0 warning, 0 info. Rewriting all seven rows as directives is clean at B (83/100).
The scorecard is the most reviewed document a contact centre owns. Quality assurance argued it into shape, team leads coach against it every week, and every line has survived somebody objecting to it. So when the agent needs to know what good looks like, the rubric is the obvious source, and pasting it under a heading is the obvious move. It is a better instinct than most: the policy really is correct, and it really is agreed. The problem is not the content. It is that a rubric is written to grade a person who has already finished, and a prompt is written to instruct a machine that has not started.
§1The paste
Here is Mira, a care agent for a broadband ISP. A role line, then the quality standards, copied out of the QA sheet with the numbering intact because nobody retypes a rubric.
# Role You are Mira, the customer care agent for Northwind Broadband. # Quality standards 1. Did the agent greet the customer by name within the first 15 seconds? 2. The agent verified the account before discussing billing. 3. Empathy was demonstrated at least once during the contact. 4. Agent used the customer's preferred name throughout 5. Was a realistic timeframe set for the fix? 6. Hold time was kept to a minimum. 7. Did the agent offer additional help before closing?
One thing to note before the output, because it decides everything that follows: # Quality standards is not a prose block. The exempt headings are Role, Persona, Context, Background, Examples and Notes, and this is none of them, so every row below it goes through the full rule analysis. The checker is looking at these lines as hard as it looks at anything. That is what makes the result worth reading.
§2Seven findings, nothing blocking
mira.tg:6:1 info prompt/unintroduced-definite "the account" retrieves something this document never introduces - a model must guess which account is meant. mira.tg:7:1 warn prompt/agentless-passive The doer is deleted (agentless passive) - who performs this? Name the actor or use the imperative: "Verify the order." instead of "The order is verified." mira.tg:7:1 info prompt/unintroduced-definite "the contact" retrieves something this document never introduces - a model must guess which contact is meant. mira.tg:8:1 warn structure/missing-period Unterminated statement — end it with a period (or ! ?; a lead-in may end with ":"). Statement boundaries are a compile contract. mira.tg:8:1 info prompt/unregistered-doer A bare generic doer never enters the world model - instruction to the agent, or background about users? Use the imperative if the agent acts, or a definite party ("The user should ...") to register the doer. mira.tg:9:1 info prompt/unintroduced-definite "the fix" retrieves something this document never introduces - a model must guess which fix is meant. mira.tg:10:1 warn prompt/agentless-passive The doer is deleted (agentless passive) - who performs this? Name the actor or use the imperative: "Verify the order." instead of "The order is verified." ✓ 1 file — 0 error, 3 warning, 4 info
Read the line numbers rather than the codes. The file has seven policy rows, on lines 5 to 11. The findings land on 6, 7, 8, 9 and 10. Lines 5 and 11, the two rows that open with Did the agent, produced nothing at all, and line 9 produced only a note about the words the fix and nothing about the row itself.
That is the shape of this whole teardown, and it is worth stating before the mechanics: the rows the checker complained about are the ones closest to being usable, and the rows it stayed silent on are the ones that are not instructions. Silence here is not approval. It is the analysis reporting that there was nothing in its plane to look at.
mira.tg — D (62/100) proven errors: none tiers: base+z3 planes runtime 72 (what the model reads) · hygiene 32 (source only) facets enforceability 57 x.21 · hardness 100 x.12 · directness 53 x.08 · consistency 100 x.17 · structure 63 x.12 (hygiene) · annotation 0 x.12 (hygiene) · style 0 x.08 · security 100 x.08
§3The three grammars a rubric is written in
Sort the seven rows by their sentence type and the file resolves into three groups, none of which is a directive.
- The interrogative. Rows 1, 5 and 7: Did the agent greet the customer by name? A question asks a grader for a verdict. In TypeGlish it classifies as prose, the catch-all, so it reaches the model as text and never enters the rule plane. Three of the seven rows are here.
- The past-tense report. Rows 2 and 4: The agent verified the account before discussing billing. This is a claim that something already happened, about a third party called the agent, and the agent reading it is you. Row 4 also drops its subject to a bare Agent, which is what
prompt/unregistered-doeris reporting: a generic doer that never enters the world model. - The agentless passive. Rows 3 and 6: Empathy was demonstrated, Hold time was kept to a minimum. The actor has been deleted from the sentence entirely. This is the one grammar the checker names outright, twice, with the fix attached: name the actor or use the imperative.
None of this is sloppy writing. Every one of those grammars is correct for a scorecard. A rubric is scored after the contact by somebody who was not on it, so the tense is past, the subject is the agent rather than the reader, and the question mark is the instrument: it is what a grader ticks. Move the same words in front of a model that is about to answer a customer and the mood is wrong in a way no amount of good policy fixes.
A rubric asks whether it happened. A prompt says to do it. Only one of those has a verb your compiler can hold.
§4One meaning, four grammars, one proof
The claim that a question is inert is easy to assert and easy to test, so here it is tested. Four files, identical except for the last line, each carrying a rule that caps greeting at 30 seconds and then a second statement that puts the same greeting at 15 seconds. Every version means the same thing to a human. One of them is a rule.
# Role You are Mira, the customer care agent for Northwind Broadband. # Constraints - You MUST greet a caller within 30 seconds. - You MUST greet a caller within 15 seconds.
$ tail -1 g1.tg - You MUST greet a caller within 15 seconds. g1.tg:5:1 error logic/time-strength One bound per slot — "within 15 seconds" already entails "within 30 seconds"; the looser rule on "you greet a · caller" is dead weight. Keep one. (conflicts with line 5) g1.tg:6:1 error logic/time-strength One bound per slot — "within 15 seconds" already entails "within 30 seconds"; the looser rule on "you greet a · caller" is dead weight. Keep one. (conflicts with line 4) ✗ 1 file — 2 error, 0 warning, 0 info $ tail -1 g2.tg 1. Did the agent greet the caller within the first 15 seconds? ✓ 1 file — 0 error, 0 warning, 0 info $ tail -1 g3.tg - A caller was greeted within 15 seconds. g3.tg:6:1 warn prompt/agentless-passive The doer is deleted (agentless passive) - who performs this? Name the actor or use the imperative: "Verify the order." instead of "The order is verified." ✓ 1 file — 0 error, 1 warning, 0 info $ tail -1 g4.tg - The agent greeted a caller within 15 seconds. ✓ 1 file — 0 error, 0 warning, 0 info
The passive gets a warning, which is the checker doing the most it can with a sentence that has no actor: it can see the shape, it cannot see a rule. The question and the third-person report get nothing, and the third-person one is the quietest failure of the set, because The agent greeted a caller looks like a well-formed statement. It is. It is a statement about somebody called the agent, and this prompt never said that was you. That subject-indexing behaviour has its own consequences worth reading about, and a pasted rubric hits every one of them at once, because a rubric never addresses its reader.
§5Strict mode does not save you
The reasonable next move, and the one most teams reach for, is to turn the dial up. It does almost nothing here.
mira.tg:8:1 error structure/missing-period Unterminated statement — end it with a period (or ! ?; a lead-in may end with ":"). Statement boundaries are a compile contract. ✗ 1 file — 1 error, 2 warning, 4 info
This is worth sitting with, because it is the general lesson and not a quirk of this file. --strict escalates findings the checker already made. It does not make new ones. Every row here that says nothing to the analysis says nothing to strict mode either, and the only line that got promoted is the one with a punctuation defect. A grammar the analysis never entered cannot be escalated into it, and no flag anywhere in the toolchain will change that. The fix has to happen in the file.
§6The rewrite: seven rows, seven directives
The policy does not change. Each row gets a subject, a modal and, where the rubric implied a number, the number written out where the solver can reach it.
# Role You are Mira, the customer care agent for Northwind Broadband. # Constraints - You MUST greet a caller by name within 15 seconds. - You MUST verify an account before you discuss billing. - You MUST acknowledge how a caller feels at least once in every contact. - You MUST use the name a caller gives you. - WHEN you promise a fix THEN you MUST give a calendar date. - You MUST NOT hold a caller for more than 30 seconds. - You MUST ask whether a caller needs anything else before you close.
0 error, 0 warning, 0 info. Seven rows in, seven rows out, and the heading changed from # Quality standards to # Constraints because that is now what they are.pasted rewritten D (62/100) B (83/100) runtime 72 · hygiene 32 runtime 94 · hygiene 50 enforceability 57 enforceability 79 directness 53 directness 99 structure 63 structure 100 style 0 style 100 0 error, 3 warning, 4 info 0 error, 0 warning, 0 info
Three of the seven rows required a decision that the rubric had been quietly deferring, and those are the rows worth arguing about at the rewrite meeting rather than at the incident review.
- Hold time was kept to a minimum became at most 30 seconds. A minimum is not a number. Somebody has to pick one, and now it is in a slot where a later edit that contradicts it is a blocking error instead of a second opinion.
- Was a realistic timeframe set for the fix? became a guarded rule: WHEN you promise a fix THEN you MUST give a calendar date. Realistic is a judgement a grader makes afterwards with information the agent does not have during the call. A calendar date is a thing the agent can be told to produce.
- Empathy was demonstrated at least once became acknowledge how a caller feels at least once in every contact. Empathy is not an action, and a prompt cannot ask for one. Acknowledging is.
Notice what that list is. Three of the seven rubric rows were not policies at all, they were observations a human is trusted to make, and the trust was doing the work. That is fine when a team lead is scoring a call. It is nothing at all when the reader is a model.
§7Common questions
- Can I use my QA scorecard as an agent system prompt?
- Not as it stands, because a scorecard is a grading instrument and a system prompt is an instruction set, and the two are written in different grammars. A seven-row rubric pasted under a heading checks at
0 error, 3 warning, 4 infoand scores D (62/100), and the warnings are all about the grammar rather than the policy:prompt/agentless-passivetwice andstructure/missing-periodonce. The content is right. The mood is wrong. Rewrite every row as a directive with a subject, a modal and a bound, and the same seven rules check at0 error, 0 warning, 0 infoand score B (83/100). - Why does my agent ignore rules that are written as questions?
- Because a question is not an instruction, and nothing in the toolchain treats it as one. In TypeGlish an interrogative row falls through to prose, which is the catch-all statement type, so it is passed to the model as text and never enters the rule plane. The proof is a controlled pair against a prompt that already caps greeting at 30 seconds: the directive
You MUST greet a caller within 15 secondsis 2 blockinglogic/time-strengtherrors, andDid the agent greet the caller within the first 15 seconds?on the same line of the same file is0 error, 0 warning, 0 info. Same fact, same number, and only one of them is a rule. - What does prompt/agentless-passive mean in a system prompt?
- It means the sentence deleted whoever is supposed to act.
Hold time was kept to a minimumnames an outcome and no actor, so the checker reports the doer is deleted (agentless passive) and suggests the imperative instead. It is a warning rather than an error because the sentence is not wrong, it is unaddressed: the model has to infer that the missing actor is itself. Rows like this are the signature of text written to grade somebody after the fact, which is exactly what a QA rubric is. - Does typeglish check --strict catch a QA scorecard pasted into a prompt?
- Barely. Running
check --stricton the seven-row paste escalates it to1 error, 2 warning, 4 info, and the single blocking error isstructure/missing-periodon the one row that forgot a full stop. Not one row is blocked for what it says. Strict mode escalates findings the checker already made, and the checker made no finding about a question or a past-tense report, because it read them as prose. A grammar the analysis never entered cannot be escalated into it.
The reason this paste is more dangerous than most is that it arrives pre-approved. A policy document at least looks like something that needs converting, and the seven info findings it produces read as work to do. A scorecard reads as done: it is numbered, it is signed off, it is the thing the whole floor is measured against, and pasting it feels like the opposite of cutting a corner. Then it lands in a file where three of its rows are prose, two are claims about a third party, and the one blocking error in strict mode is a missing full stop. Where the rows land at all depends on the heading above them, which is its own quiet lever: under # Context the same seven lines would have been exempt from analysis entirely, and the file would have looked cleaner while saying even less.