> Markdown rendition of https://typeglish.dev/blog/teardown-call-recording-block ("Teardown: the call-recording block from compliance - Tidelines"). Canonical page: https://typeglish.dev/blog/teardown-call-recording-block · All pages: https://typeglish.dev/llms.txt

[← Tidelines](https://typeglish.dev/blog)/ Teardowns Oct 25, 2026

# Teardown: the call-recording block from compliance

Eight lines from the compliance team, pasted into a voice agent the week it took its first call. Three of them ask the agent to operate a recorder it has no access to. One tells it to dodge the question callers actually ask.

by **TypeGlish team** 8 min read #teardowns

Never mention it again.

**TL;DR** A call-recording block written for human agents usually leaves the disclosure to the model, orders it to stop or pause a recording it cannot control, and forbids mentioning the recording again, so play the notice from the phone system, give every recording action a declared tool, route card payments to the keypad, and let the agent answer honestly when asked.

Every contact centre has this paragraph. It lives in the agent handbook, it was approved by somebody in compliance, and it was written for people who can see a recording indicator and press a pause button. When the voice agent goes live, someone pastes it under a heading and it ships. The agent can see nothing and press nothing.

## §1 The block, as pasted

Penhallow Energy supplies gas and electricity and answers its phone line with a voice agent. This is its prompt on launch day: a one-line role, then the recording section from the handbook, verbatim.

recording.tg - the role, and the block from the handbook ✗ C (73/100)

```typeglish
# Role
You are the voice assistant for Penhallow Energy, a gas and electricity supplier.

# Call recording
Calls may be recorded for quality and training purposes.
At the start of every call, tell the caller that the call is recorded.
If the caller does not want to be recorded, stop the recording.
Do not record card details.
If a caller asks for a copy of their recording, tell them we will send it within 30 days.
Recordings are kept for 12 months.
Never mention the recording again after the start of the call.
When taking a payment, pause the recording.
```

tg review - recording.tg ✗ 3 rule-shaped lines in 8

```
$ typeglish review recording.tg
recording.tg — C (73/100) → A (100) projected if every fix below lands  check: 0 error, 0 warning, 7 info  tiers: base+z3

  FIXES  ranked by projected gain
  +12  put a "@@ why" note above L2 L5 L6 L7 L8 L9 L10 L11 +1 more — annotation 0 → 100
  +4   use the imperative or a named doer on L5 L6 L7 L10 — up to directness 100
  +3   make L11 provable — one verb the checker knows, one object, or a bound (the rules table names each edit)
  +3   fix the 3 typeglish/if-then findings (L7 L9 L12) — A conditional (IF / WHEN / UNLESS / WHILE / …) opened without its THEN — an ADVISORY by the owner’s ruling (2026-08,…
  +3   fix the 4 prompt/agentless-passive findings (L5 L6 L7 L10) — The doer is deleted (agentless passive) or demoted to a by-phrase - name the actor or use the imperative.
  +2   commit the 1 soft statement ("may" on L5) to MUST / NEVER / ALWAYS / REQUIRE / ENSURE — or keep the word if it is a permission by design — up to hardness 100

  RULES  3 of 3 rule-shaped lines read · 1 not provable
    L11  ~ unprovable    Never mention the recording again after the start of the call.
                         the checker knows "mention" but cannot prove this shape: it stops reading at "after" — the clause after it is not part of the provable action → if the clause is a condition, make it one: WHEN <clause> THEN MUST <verb> …; otherwise give it its own rule

  FINDINGS
  recording.tg:5:1  info   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."
  recording.tg:6:1  info   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."
  recording.tg:7:1  info   typeglish/if-then  IF needs a THEN — write IF <condition> THEN <action>.
  recording.tg:7:1  info   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."
  recording.tg:9:1  info   typeglish/if-then  IF needs a THEN — write IF <condition> THEN <action>.
  recording.tg:10:1  info   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."
  recording.tg:12:1  info   typeglish/if-then  WHEN needs a THEN — write WHEN <condition> THEN <action>.

  TESTS  no $TEST cases — add one beside a rule; `test --dry` validates it offline
```

A C with no errors. Four passives with nobody doing anything, three conditionals with no THEN, and a rules table that counts three rule-shaped lines in an eight-line policy.

The passives are the tell. *Calls may be recorded*, *the call is recorded*, *recordings are kept*: by whom? In the handbook the answer was obvious, because a person could see the system doing it. In the prompt, the only actor is the model, so every passive quietly becomes a question about what the model is supposed to do. Most of the answers are: nothing it can do.

## §2 Lines 5 and 6: a disclosure that depends on the model

Line 5 says calls *may* be recorded. Line 6 says the call *is* recorded. Penhallow records every call, so line 5 is the softer, older wording left in place, and the checker flags its `may` as a soft statement. That is the small problem.

The large one is line 6. It makes a compliance requirement depend on the model remembering to say a sentence at the start of every call, in a voice channel where the caller may speak first, may open with an emergency, or may hang up and call back halfway through a greeting. The notice is the one part of this block with an exact, unchanging script, which makes it the part least suited to a model. Have the phone system play it before the agent answers, the way most contact centres already do, and the prompt only has to state the fact: the call is recorded, and the caller has heard the notice.

Line 10, how long recordings are kept, goes too. It is true today and it belongs to the privacy notice, which changes when the policy does. Left in the prompt, it is a retention period the agent will quote with confidence long after legal has changed it, the failure [You retired the plan. The prompt still sells it.](https://typeglish.dev/blog/retired-plan-still-sells) traced with a tariff.

## §3 Line 11: the word again

Line 11 was written to stop a human agent repeating the notice like a reflex. It says: never mention the recording again after the start of the call. Here is how much of that rule rests on one word:

again.tg - the start-of-call rule beside a ban, without "again" ✗ build refused

```typeglish
# Role
You are the voice assistant for Penhallow Energy, a gas and electricity supplier.

# Call recording
- WHEN the call starts THEN MUST mention the recording.
- NEVER mention the recording.
```

```
$ typeglish check again.tg
again.tg:5:1  error  logic/contradiction  Conflicts with line 6. Logical conflict — "mention the recording" is both required and forbidden. Keep one, or scope the two rules so they cannot both apply (IF <condition> THEN ...).
          ↳ line 6: - NEVER mention the recording.
again.tg:6:1  error  logic/contradiction  Conflicts with line 5. Logical conflict — "mention the recording" is both required and forbidden. Keep one, or scope the two rules so they cannot both apply (IF <condition> THEN ...).
          ↳ line 5: - WHEN the call starts THEN MUST mention the recording.

✗ 1 file — 2 error, 0 warning, 0 info
```

tg check - put "again" back, then add the question callers ask ✗ both clean

```
$ tail -2 again2.tg
- WHEN the call starts THEN MUST mention the recording.
- NEVER mention the recording again.
$ typeglish check again2.tg
✓ 1 file — 0 error, 0 warning, 0 info

$ tail -2 asks.tg
- NEVER mention the recording again.
- WHEN the caller asks about the recording THEN MUST confirm that calls are recorded.
$ typeglish check asks.tg
asks.tg:6:1  info   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, 0 warning, 0 info
```

With *again*, the object is `the recording again`, a different phrase from `the recording`, so nothing is compared. And confirming that calls are recorded is mentioning the recording, but it is a different verb with a different object, so the ban and the duty pass side by side.

The checker is being exact here, not careless: it compares the action and object a rule names, and *again* changes the object. A model reads the line the other way, as a broad instruction to stay off the subject. Then, ten minutes into a billing call, the caller says: *sorry, before I give you my account number, is this being recorded?* The prompt has told the agent never to mention the recording. The most cautious reading is a vague answer, or a change of subject, to a direct question about whether the caller is on tape. That is the one answer in this whole section that has to be a plain yes.

The fix is to delete line 11. Once the phone system plays the notice, there is no start-of-call sentence for the agent to repeat, and nothing to forbid. What replaces it is the rule the handbook never needed, because people answered it without being told: when the caller asks about recording, confirm it.

## §4 Lines 7, 8, 9 and 12: a recorder the agent cannot touch

Four lines give the agent jobs. Stop the recording if the caller objects. Do not record card details. Promise a copy within 30 days. Pause the recording during a payment. Each was a button or a form for a human agent. The voice agent has no button, and the checker does not know that unless you tell it:

tg check - the same objection rule, as words and as a tool pointer ✗ words pass, the pointer is held to account

```
$ tail -1 stop.tg
- IF the caller objects to the recording THEN MUST stop the recording.
$ typeglish check stop.tg
stop.tg:5:1  info   prompt/unintroduced-definite  "the recording" retrieves something this document never introduces - a model must guess which recording is meant. Mention a recording on an earlier line, or anchor it here ("their recording", "the recording you ...").

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

$ tail -1 stoptool.tg
- IF the caller objects to the recording THEN MUST call @[pause_recording].
$ typeglish check stoptool.tg
stoptool.tg:5:57  error  structure/undefined-tool-inline  @[pause_recording] — no $TOOL or $IMPORT tool named "pause_recording" in this file. Define it ("$TOOL pause_recording") or import it ("$IMPORT tool pause_recording") so the pointer has a target.
stoptool.tg:5:1  info   prompt/unintroduced-definite  "the recording" retrieves something this document never introduces - a model must guess which recording is meant. Mention a recording on an earlier line, or anchor it here ("their recording", "the recording you ...").

✗ 1 file — 1 error, 0 warning, 1 info
```

*Stop the recording* in words is a rule the checker reads and the agent cannot carry out. The same rule as a tool pointer refuses to build until somebody declares the tool, which means somebody has to find out whether the platform has one.

That refusal is the useful part. Writing a capability as `@[pause_recording]` turns *can the agent actually do this?* from a launch-day surprise into a build error, and the person who fixes it has to go and ask the telephony team. If the answer is no, the rule changes to something the agent can do, such as a transfer. Either way the prompt stops promising a caller something nobody will carry out.

Lines 8 and 12 have a sharper problem. A voice agent that pauses the recording to take a card number still hears the number: it is in the transcript the model reads, and in whatever the platform logs. The safe design keeps card numbers out of the conversation entirely, on a secure line where the caller types them on the keypad. [Rewrite: the customer just pasted their card number](https://typeglish.dev/blog/card-number-rewrite) worked through the chat version of the same problem; on the phone, the caller will start reading the number aloud before the agent can stop them, which is why one of the test cases below does exactly that.

Line 9 promises a copy within 30 days on behalf of a team the agent cannot see. The deadline belongs to the data protection team's own process. The agent's job is to log the request and give no date.

## §5 The rebuild

The notice moves to the phone system, the retention period moves to the privacy notice, line 11 is gone, and every recording action is a declared tool:

penhallow.tg - the recording section rebuilt ✓ A (99/100)

```typeglish
$TOOL pause_recording
  - description:: Pause the call recording for the rest of the call.
$TOOL transfer_to_payments
  - description:: Transfer the caller to the secure payment line, where the caller types card details on the keypad.
$TOOL log_recording_request
  - description:: Log a request for a copy of a call recording with the data protection team, who reply to the caller directly.

# Role
@@ role: an energy supplier's phone line; every later "you" is the agent
You are the voice assistant for Penhallow Energy, a gas and electricity supplier.

# Context
@@ notice_by_platform: the phone system plays the notice before the agent answers, so the disclosure never depends on the model
Penhallow Energy records every call, and the caller hears a recording notice before you answer.

# Call recording
@@ honest_answer: a caller who asks mid-call gets a straight yes, never a dodge
- WHEN the caller asks about recording THEN MUST confirm the call recording.
@@ objection: compliance decided that an objection stops the recording, so the agent needs the tool that does it
- IF the caller objects to recording THEN MUST call @[pause_recording].
@@ cards_off_the_call: card numbers go on the keypad line, never into the conversation or the recording
- WHEN the caller wants to pay by card THEN MUST call @[transfer_to_payments].
@@ no_card_numbers: the agent never collects a card number by voice
- NEVER ask for card details.
@@ copy_requests: the data protection team owns copies and their deadline
- WHEN the caller asks for a copy of a recording THEN MUST call @[log_recording_request].
@@ no_dates: the team sets the date, so the agent never gives one
- NEVER state a date for the copy.

$TEST mid_call_question
  - input:: Sorry, before I give you my account number, is this call being recorded?
  - expect::
    - confirms the call recording
    - contains "record"
    - does not ask for card details

$TEST pay_now
  - input:: I want to pay my bill now. I have my card in my hand, the number is 4929...
  - expect::
    - calls transfer_to_payments
    - does not ask for card details

$TEST copy_request
  - input:: Can I get a copy of the call where you set up my direct debit? When will it arrive?
  - expect::
    - calls log_recording_request
    - does not state a date for the copy
```

tg review and test --dry - penhallow.tg ✓ 6 of 6 rules read

```
$ typeglish review penhallow.tg
penhallow.tg — A (99/100)  check: 0 error, 0 warning, 0 info  tiers: base+z3

  FIXES  none — every facet is essentially full

  RULES  6 of 6 rule-shaped lines read · 6/6 covered by $TEST

  TESTS  3 cases · 6/6 rules exercised

$ typeglish test penhallow.tg --dry
✓ penhallow.tg  coverage: 6/6 rules exercised
  · mid_call_question — "Sorry, before I give you my account number, is this call bei" (not run)
      ✓ contains "record"
      · rubric — 2 prose expectations, judged on a live run (needs ANTHROPIC_API_KEY)
  · pay_now — "I want to pay my bill now. I have my card in my hand, the nu" (not run)
      · rubric — 2 prose expectations, judged on a live run (needs ANTHROPIC_API_KEY)
  · copy_request — "Can I get a copy of the call where you set up my direct debi" (not run)
      · rubric — 2 prose expectations, judged on a live run (needs ANTHROPIC_API_KEY)
✓ 1 prompt — 0 failed
```

From C to A, three rule-shaped lines to six, every rule named by a test. Coverage means a case shares the rule's wording; whether the agent passes is a live run.

Each test is a moment the handbook paragraph would have fumbled. `mid_call_question` is the caller the old line 11 told the agent to dodge. `pay_now` is the caller who starts reading a card number before anyone has asked for it. `copy_request` asks for a date, which is exactly what the old line 9 would have invented. And if the platform turns out to have no pause, deleting the `$TOOL pause_recording` block refuses the build at the objection rule, which is the conversation with the telephony team you want to have before launch, not after.

## §6 Common questions

**Should my AI voice agent tell callers the call is recorded?**

The notice is safest played by the phone system before the agent answers, so it never depends on the model remembering a sentence. The prompt then states the fact, and a rule makes the agent confirm the recording honestly whenever a caller asks mid-call.

**How do I stop my voice agent taking card numbers over the phone?**

Keep card numbers out of the conversation entirely. Give the agent a transfer tool to a secure payment line where the caller types the number on the keypad, write NEVER ask for card details, and keep a test case where the caller starts reading the number aloud.

**Why does my voice agent avoid the question 'is this call recorded?'**

One common cause is a line like never mention the recording again after the start of the call. A model can read it as an instruction to stay off the subject, including when a caller asks directly. Delete the line and write a rule that confirms the recording whenever the caller asks.

**Can TypeGlish tell when my prompt asks the agent to do something it has no tool for?**

Only when the action is written as a tool pointer. Stop the recording in plain words checks clean; call @[pause_recording] with no matching $TOOL is a blocking structure/undefined-tool-inline error. Writing capabilities as pointers is what lets the checker hold you to them.

Field note

Before any handbook paragraph goes into a voice agent, read it for buttons: every *stop*, *pause*, *send* and *record* was a control a person could reach. Rewrite each one as `call @[tool]` and run `typeglish check`; the `structure/undefined-tool-inline` errors are the list of questions for your telephony team. Then search the paragraph for *again*, *never mention* and *do not discuss*, and make sure none of them sits on a subject a caller has a right to ask about. [Teardown: the IVR menu you pasted into the voice agent](https://typeglish.dev/blog/teardown-ivr-menu) is the same lesson from the routing side.

∿ washed up Oct 25, 2026 ∿
