# Chad's 28 calls — what they showed, and what has been fixed

*For Ken and Dil. Written 2026-08-17 from the 28 transcripts Dil supplied,
14–16 August, all to GC's number. Read end to end, all 28.*

**One of these calls overcharged a real booking by $50 and nothing flagged it.**
It was found by a person listening to a recording three days later. That is the
headline, and it is why the fixes below are code rather than more prompt text.

---

## The numbers

| | |
|---|---|
| Calls | 28 |
| Booked | **11** (39%) |
| Ended "I'll call you back" | 10 |
| Out of area, correctly declined | 1 |
| Never got started (hang-up, bad line) | 3 |
| **Priced wrong** | **2** — one booked at the wrong price |
| **Lost to a fault that was ours** | **1** — a valid phone number rejected three times |

Nobody asked Josh whether he was a person. Nobody said the word *cancel*. Nobody
asked for a pre-drywall. **Those three are still untested** and they are on the
scenario list for Tuesday.

---

## 🔴 1. A booked customer was charged $50 too much

A 2,300 sq ft home in Pearland. Josh said:

> *"Great. So with your home at 2300 square feet, the 5-star package is 622
> dollars."*

**2,300 is in the 0–2,500 band. The answer is $572.** She agreed, she was booked,
and the work order went out at $697 with the pool add-on instead of $647.

⚠️ **`quote_price` was never called on that call.** Not once — there is no lookup
line anywhere in the transcript. The figure came out of the model's head.

**And the same square footage was priced correctly on a different call the same
day** ($572 at 2,300 sq ft), which is what makes it a coin-toss rather than a bad
table. The table is right. Reading it is what fails.

---

## 🔴 2. Chad caught a $120 error himself, mid-call

Chad's own test call. `quote_price` **was** called, and returned **$572**, and
Josh said it. Ninety seconds later:

> Chad: *"So how much is it to do everything?"*
> Josh: *"That's **452 dollars** total."*
> Chad: *"Did, did you say 452 dollars?"*
> Josh: *"Let me correct that, 572 dollars."*

He re-answered from memory and the number mutated. **Chad queried it because Chad
knows the price.** A real customer does not argue with a number in their favour —
they say "great", and we are held to $452 for a $572 job.

---

## 🔴 3. A caller gave the right phone number three times and hung up

The worst call in the set, and the fault is entirely ours. Luciana, calling to
book:

> Caller: *"832-555-0149."*
> Josh: *"Let me make sure I have that right. You're saying 832-555-0149?
> **That's 9 digits.** I wanna get this exactly right for you. Could you give me
> that again?"*

**It is ten digits.** She repeated it. He asked a third time — *"I'm hearing some
different groupings"* — she gave the same ten digits again, and hung up at 2:04.
No name, no property, no booking.

Three things went wrong in one sentence, and two of them were already forbidden
in capitals in the prompt: *never say the digit count out loud*, and *never phrase
a miss as the caller's* (*"you're saying… that's nine"* is the exact wording the
prompt gives as the thing not to say). The third is underneath both — **the model
counted a ten-digit string as nine**, and no prompt rule reaches that.

---

## 🟠 4. Two sales lines that work against us

Both said kindly, both said twice:

> *"Great news. We've got **plenty of availability** within your window."*
> *"We've got plenty of availability, so **you'll have no trouble finding a
> time**."* — said to a caller who was leaving

It tells a buyer that the inspector nobody else is booking is the one they are
about to hire, and it removes every reason to decide today. The second one was
the last thing a departing caller heard.

And this, in a recap:

> Josh: *"And just to confirm, the 5-star package is 572 dollars. **Is that
> right?**"*
> Caller: *"Well, **you tell me**. You're the one coming up with the price. I
> don't know."*

The recap is for checking what **they** told us — their name, their address,
their square footage, the day. **The price is ours.** Asking them to confirm it
makes it sound like a guess.

---

## ✅ What has been fixed, and how

**The price fixes are mechanical, not prompt text.** The prompt already forbids
every one of the errors above, at length, in about a dozen places, and they
happened anyway. `CLAUDE.md` has the pattern written down from the false-booking
incident: *a prompt rule is a request, and this has to be an answer.*

### A dollar amount Josh did not get from the tool does not reach the caller

It sits in the same guard that already stops him claiming a booking that does not
exist, and it splits two ways:

- **`quote_price` has never succeeded on this call** → every figure is invented by
  definition, so **the sentence is blocked**. There is nothing to substitute — we
  do not know the right answer either — so the caller hears the same true holding
  line and Josh still has the lookup to do. **This is exactly the $622 call.**
- **`quote_price` has succeeded and this figure is not one it returned** →
  **logged, loudly**, not blocked. A drift like the $452 rides inside a sentence
  carrying real information, and the guard that rewrote whole turns broke live
  calls at turn one. **This is exactly the $452 call**, and next time it will be
  in the log the same morning rather than found on a recording three days later.

It is deliberately generous about what counts as quoted — every line item, every
total, every alternative, and any sum of the line items, because *"572 plus 75,
that's 647"* is Josh doing what he is told. Flat prices from the client's own
setup count too (the $75 pool check, the $425 pre-drywall); the server now sends
that list.

> ⚠️ **The square-footage tables are deliberately NOT on that list**, and that
> exclusion is the whole point — every banded price is one Josh must get from the
> tool, because picking the band is what he gets wrong. **Two tests assert it from
> opposite directions**, so a future edit that finds the guard noisy and widens the
> list cannot quietly re-open the $622 call.

### The false digit count is not spoken

If Josh reads back ten digits and then tells the caller it was nine, the claim is
stripped and the rest of the sentence goes out unchanged.

⚠️ **This does not fix the miscount.** The model still believes it, so it may
still ask again. What it removes is the part that makes a caller feel accused of
getting their own phone number wrong. **Fixing the belief means handing the model
the count instead of leaving it to count — that is a bigger change with its own
test call, and it is the top open item on the voice side.**

### Three prompt rules, in both brains

Each one carries the call it came from, so nobody edits it out later wondering
what it was for:

1. Never ask the caller to confirm a price.
2. Say a price once and do not re-derive it.
3. Never tell a caller how empty the diary is.

---

## What was working, and worth saying

- **The greeting and the recording notice** were correct on 25 of 28 calls.
- **The out-of-area call was handled well** and took 100 seconds — right answer,
  no time wasted, no bad feeling.
- **The read-back caught a genuine mishear.** A caller said 6,200 sq ft, it came
  through as 2,600, Josh quoted the wrong price, then re-checked it himself —
  *"you said around 6200, which I took as 2600. Is that 2600 or did you mean
  something different?"* — and corrected to $972. That is the protocol working.
- **A slot was taken during the call** and Josh handled it cleanly: *"I'm sorry,
  that 1:00 went while we were talking. I've moved you to Wednesday the 19th at
  9:00 — does that work?"* Yes, it did.
- **The withdrawal was handled properly.** *"Just a minute, I changed my mind, let
  me talk to my wife first"* → *"Of course, take your time."* No pressure.
- **The false-booking guard fired three times in 28 calls** and each time it did
  its job. It is the *"let me just double-check that before we go any further"*
  line — that is not a stumble, that is Josh being stopped from telling somebody
  they were booked when nothing had saved.

---

## ⚠️ Still open — and these need a person

| | Whose |
|---|---|
| **The digit miscount itself.** The count has to come from code, not from the model. Its own change, its own test call. | Jordan / a deploy |
| **`bot.py` needs its manual deploy.** Everything above on the Python side is written and tested and **not live**: `cp` to `/opt/austin-voice/bot.py`, `pm2 restart austin-voice`, then one test call. | Ken or Dil |
| **The wrongly-priced booking.** One live booking is $50 high. Someone has to decide whether to correct it or honour it. | Ken |
| **The AI disclosure.** Ken ruled it on Monday; it is in neither brain and nobody asked on any of these 28 calls, so it is still untested as well as unbuilt. | Ken's ruling, then a build |
| **Three untested scenarios** — the marketer, the angry caller, the pre-drywall. Nobody hit any of them in 28 calls, and the pre-drywall is a known live fault. | Tuesday's scenario sets |

---

*Source: 28 transcripts, 14–16 August 2026, `+1-704-520-8683`. One duplicate file
was discarded. Every quotation above is verbatim.*
