The problem

Some things can only be arranged by phone. A clinic with no online booking. A garage. A landlord. A government office whose web form has been "temporarily unavailable" for two years.

If you cannot use a phone line, that is not an inconvenience. It is a door that does not open. Deaf and hard of hearing callers, people whose language does not match the line they have to ring, anybody who cannot manage a phone conversation that day.

What it does

One call. It says in its first sentence that it is an automated assistant calling on behalf of a named person with their permission, that it is not a person and that what is said is being written down. It asks the errand's questions. It can accept a time, but only inside windows the person set. Then it hands back the answers, exactly what was disclosed about them and the transcript in writing.

It is not a relay service and it does not pretend to be a person. Those two limits are the design rather than a disclaimer. The FCC declaratory ruling of 8 February 2024 puts AI generated voices inside "artificial" under the TCPA, so the disclosure is the law rather than a courtesy.

The disclosure budget

Handing over a phone call means handing over the right to say things about you. So the errand file carries an explicit list of what may be said. Three gates check it.

Gate When What it does
The request file at load A question carrying an identifier nobody authorized is refused. A payment card, a password or a national identifier in the budget is refused outright, whatever the file says.
The script before the call The generated script is scanned for anything personal that is not in the budget. A finding refuses the call and nothing is placed.
What was said after the call Everything the caller actually said is scanned the same way and anything outside the budget is reported to the person it belongs to.

Findings are masked in every report, because a privacy report that quotes the leak is not a privacy report. Why somebody delegated the errand never goes to CALL-E at all. It stays in the file and on the preview.

What the report will not claim

This is where most of the work went, over eight rounds of review.

A status is not evidence. A per question answer needs a callee turn behind it that actually supports the answer. That turn lands in the report as the quote. An agreement claimed by the extraction with no agreeing turn reads unconfirmed and the confirmation code is dropped.

Evidence is anchored to what the caller last put to the callee. A sentence is evidence only for the thing it was answering. That sounds obvious and it is where every bug lived. "I am calling to book an appointment. Do you accept Aetna?" is two things in one turn, so a no after it is a no about insurance rather than a refused appointment. The classifier splits a caller turn into clauses on sentence ends, semicolons, colons, commas, dashes and coordinators, then needs the booking language and the ask form inside one clause. The anchor only ever looks backwards, because nothing said after a turn can be what that turn was answering.

How it was built

TypeScript on @call-e/calle, tsx plus node:test, no build step, a local fake CALL-E so it runs with no account. The preview is the primary interface: it prints the exact script, the budget, the windows and a receipt of the whole thing. A live call refuses to go out unless that receipt is handed back.

What is real

142 tests, tsc --noEmit clean, npm run demo runs six cases including a clinic that refuses automated callers, a time outside the authorized window, the three privacy gates refusing with calls placed 0, plus an extraction that claims agreement the transcript does not support.

Built With

  • accessibility
  • call-e
  • call-e-sdk
  • json-schema
  • node-test-runner
  • node.js
  • pii-redaction
  • privacy
  • tcpa
  • typescript
Share this project:

Updates

Submission history