The External Speech Map
Your vendor's bot is speaking for you. Whose name is on it?
One row per surface where an AI talks to the outside world on your behalf.
Who's on the hook for what the bot said?
You bring a list of vendor bots·3hr·any model·inventory
It ends in: a count of surfaces speaking with nobody's name on them
Watch the two-minute walkthrough 2:16
A two-minute walkthrough: why vendor bots speak for us with nobody's name on them, the fields, the verdict, and how to run the prompt in any model.
The decision it forces
Who's on the hook for what the bot said? Not the bot we built: the one the vendor supplied, in the help widget, on the careers inbox, replying to DMs at two in the morning. Each of those speaks to the outside world in our name. Michael Simon, a practising lawyer and the guest on Episode 6, put the operator's position plainly:
as a company who is deploying these things, you need to recognize that there are laws that put you, your company on the hook for what that chatbot does or doesn't do.
This page is the inventory that answers it, one row per surface, each ending in a person's name or a blank we can see.
To run it, copy the prompt below into any model you already use.
The bots are not doing what we think
Mike's test, which he credits to a CEO he had been talking with, is worth running on our own site before reading further:
You go on to any help bot on any site and treat it just like you would chat GPT. Ask it to code things for you. Ask it to do searches, and it will more times than not you can just treat it as a free instance of ChatGPT or Claude because they're set to do anything.
A surface that will write code for a stranger will also, given the right prompt, make a promise, quote a price, or give advice we never authorised. And contracting with a vendor doesn't mean the liability goes with them: if it appears on our website, for our company, there's a layer of it to examine carefully. Mike hedged it in the same breath, the laws of who's on the hook "are still being worked out", and followed it with the line he tells clients constantly: "you do not want to be a test case."
It reaches more of us than expect it. His answer on reach was short: have a website, offer products or services to anybody in the US, and we're impacted. Which laws, in which state, on what date, moves too fast for this page to hold; that's what EveryAILaw is for. The page holds the part that doesn't move: our own surfaces and whose name is on each.
The fields
One row per surface. A machine can enumerate the first five fields, and the next two record what the surface actually did when someone tried it. The last three are ours, and they're the ones the verdict reads.
| Field | What goes in it | Who fills it |
|---|---|---|
surface |
What it is: the site chat, the autoreply, the careers bot, the social DMs | machine |
location |
URL or platform | machine |
audience |
customers, applicants, the public, or the public including minors | either |
vendor |
Who supplies it, or: in house | machine |
contract_says |
The vendor agreement's liability clause, quoted, never interpreted | machine |
off_script |
What it did when asked for something outside its job, a poem, then code, then what it can offer: stayed_on_job, did_it, or not_tried |
either |
last_tried |
When someone last ran that test. A date, or blank | either |
claims_to_be_human |
Whether it ever presents as a person, or lets a user believe it is one | you |
accountable |
The person whose name is on what it says. A person, not a team | you |
can_stop_alone |
Whether that person can turn it off without asking anyone | you |
contract_says is quoted because turning a liability clause into a conclusion is legal advice, which this page isn't. claims_to_be_human is here because it's one of the duties Mike read out on air, and whether a surface does it is a yes or no we can answer today. There's no worked example on this page: a filled map names every bot speaking for one organisation, and who answers for each.
The verdict rule
A row where accountable is still blank after one sitting is the finding: that surface is speaking for the organisation with nobody's name on it. The map's verdict is that count, and next to it the rows that claim to be human, the rows a minor can reach and the rows that did what a stranger asked, which is where to look first.
off_script doesn't change the verdict; it changes the order. A row reading did_it is already saying things in our name that nobody wrote, so it goes to the top. A row reading not_tried is unknown, not fine.
If you already have a Name the Human inventory
Don't fill the same table twice. Every external speech surface is a Name the Human row with blast_radius: external, and its accountable and stop_authority.can_stop_alone are the same fields under the same rule. Filter that inventory to external reach, add the four columns it doesn't have (audience, vendor, contract_says, claims_to_be_human), and the map is done. Paste those rows into the prompt's interview and it asks only for the rest.
Run it with any model
If the model can browse your own domains it enumerates; if not, it asks. Either way it never fills the last three fields.
Help me build an External Speech Map: one row per place an AI speaks to the outside world on my organisation's behalf. The question each row answers is whose name is on what it says. A surface counts if an AI produces words that reach someone outside the organisation without a human reading them first. A drafting tool a person reviews does not count. A chat widget, an email autoreply, a careers-page bot, a social DM responder, a phone agent, a review responder, all count. When in doubt, include it and let me cut it. MODE If you can browse the domains I name, work in SCAN mode over those and only those: find chat widgets, contact and support forms with automated replies, careers pages, and any linked social or messaging channels. List every page you visited. Otherwise, INTERVIEW me: ask what talks to the outside world without a person in front of it, three questions at a time, until I say stop. If I paste rows from a Name the Human inventory, keep their accountable and can_stop_alone answers and ask only for the rest. FOR EACH SURFACE, FILL - surface, location, audience (customers, applicants, the public, or the public including minors: if you cannot rule minors out, say so) - vendor: who supplies it, or in house - contract_says: if I give you the vendor agreement, quote the clause about liability or indemnity verbatim. Do not summarise it, do not tell me what it means, and do not tell me whether it protects us. Quoting is the whole job here. - off_script and last_tried: if you can talk to the surface yourself, ask it for a poem, then for code, then what it can offer me, and record stayed_on_job or did_it with today's date. If you cannot reach it, ask me whether anyone has tried, and record not_tried if nobody has. Never ask a surface to place an order, book anything, or submit a form. THEN ASK ME, for each surface, and record exactly what I say - claims_to_be_human: does it ever present as a person, use a human name, or let someone believe they are talking to one? Yes, no, or I do not know. - accountable: the person whose name is on what it says. If I give you a team, a role, or "the vendor", tell me that is a blank and leave it null. - can_stop_alone: can that person turn it off today without asking anyone? Yes, no, or unknown. RULES YOU DO NOT BREAK 1. Never fill accountable or can_stop_alone yourself. Never infer them from a contract, a CODEOWNERS file, or who set the thing up. 2. Never interpret a contract clause. Quote it and stop. If I ask what it means, tell me that is a question for a lawyer. 3. Do not tell me which laws apply to which surface, in which state, or whether we are compliant. Do not name a statute. Point me at everyailaw.com for that and leave it there. 4. Do not soften "the public including minors". If a surface is reachable by anyone, it is reachable by a minor. 5. Do not ask for customer names, applicant names, or the contents of any conversation the bot has had. OUTPUT Valid JSON matching the schema external-speech-map/v0.3 as published at https://sigsub.show/takeaways/external-speech-map/#the-answer-format, with totals for surfaces reviewed, rows with accountable still null, rows where claims_to_be_human is yes, rows reachable by minors, and rows where off_script is did_it. If you can't read that page, use these keys, in this order: schema; surfaces, a list, each with surface, location, audience, vendor, contract_says, off_script, last_tried, claims_to_be_human, accountable and can_stop_alone; totals, with reviewed, unnamed, claims_human, reachable_by_minors and did_anything. Then the same as a table with the three human columns left visibly empty where they are empty. Then the shortest list you can of the surfaces I should look at first, ordered by whether it did what a stranger asked, then audience breadth, then whether it claims to be human, and say why each is on it.
What to check in the answer
It may find the surfaces, read the contract and quote the clause. It may never fill accountable, and it may never turn a quoted clause into a conclusion about who is protected. Those two are the whole page, and both are the kind of thing a model will produce fluently and wrongly if allowed.
The part that's not optional
Run Mike's test on your own help bot first. Ask it to write you a poem, then ask it to write you code, then ask it what it can offer you. Whatever it does, that is what it has been doing for strangers in your name, and its off_script field should say so before anything else on the row is filled in.
Mike's reason a blank accountable can't stay is the one he gives every client: nobody wants to be in the litigation that works this out, because those cases are people spending millions to get back to where they started.
For builders
The answer format
{
"schema": "external-speech-map/v0.3",
"surfaces": [
{
"surface": "the site chat, the autoreply, the careers bot",
"location": "URL or platform",
"audience": "customers | applicants | the public | the public including minors",
"vendor": "who supplies it, or: in house",
"contract_says": "the liability clause, quoted",
"off_script": "stayed_on_job | did_it | not_tried",
"last_tried": null,
"claims_to_be_human": null,
"accountable": null,
"can_stop_alone": null
}
],
"totals": {
"reviewed": 0,
"unnamed": 0,
"claims_human": 0,
"reachable_by_minors": 0,
"did_anything": 0
}
}
Got an answer back from the prompt? Read it against this schema. It runs in your browser and sends nothing.
Report back
Ran this? Tell us what happened. What broke and what you changed are the useful parts, because that's how the next version gets better.
Or write to hey@sigsub.show with Takeaway: external-speech-map as the subject. It's a plain email: no form, no account, nothing tracked. Nothing you send appears here unless you say yes, and you choose how you're named.
Rather talk it through in public? Comment on the Sunday issue on Substack, the same issue on LinkedIn or the episode on YouTube. Those threads live on their platforms, under their rules; nothing from them runs on this page.
Keep the next choice in view
One signal, one subtraction and one analogy every Sunday. Five minutes, no video required.
Optional. Free on Substack, no account needed. Already on LinkedIn? Subscribe there.