← Tidelines/Teardowns

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.

by TypeGlish team9 min read#teardowns
Seven rows. Three silences.

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.

mira.tg - pasted out of the QA sheet✓ exits 0
# 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?
Seven rows, every one of them a real policy somebody signed off. Row 4 is missing its full stop, which is how it sits in the sheet.

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

tg check mira.tg - output
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
Seven findings across four of the seven rows. Exit code 0, and the build would go through.

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.

tg score mira.tg - output✗ D (62/100)
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
Directness 53 and style 0 are the rubric grammar showing up as numbers. Consistency is a flat 100, because nothing in the file was ever compared with anything else.

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

the directive - the only version that is a rule✗ 2 errors
# 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.
Two bounds on one slot, so one of them is dead weight and the checker will not build the file until you say which.
tg check, the four grammars - output
$ 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 number 15 is present in all four. It is in the solver in exactly one.

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.

tg check --strict mira.tg - output✗ 1 error
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
The one blocking error is the missing full stop on row 4. Not one row is blocked for what it says.

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.

mira.tg - rewritten✓ B (83/100)
# 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.
tg score, pasted vs. rewritten - output✓ D to B
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
Directness 53 to 99 is the whole story in one facet: the rewrite is the same policy addressed to somebody.

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 info and scores D (62/100), and the warnings are all about the grammar rather than the policy: prompt/agentless-passive twice and structure/missing-period once. 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 at 0 error, 0 warning, 0 info and 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 seconds is 2 blocking logic/time-strength errors, and Did the agent greet the caller within the first 15 seconds? on the same line of the same file is 0 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 minimum names 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 --strict on the seven-row paste escalates it to 1 error, 2 warning, 4 info, and the single blocking error is structure/missing-period on 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.
Field note

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.

∿ washed up Aug 14, 2026 ∿