# Your AI told a customer \"your data has been permanently deleted.\" Nothing was deleted. Regulators read transcripts too.

> Source: <https://dev.to/chenwengui23/your-ai-told-a-customer-your-data-has-been-permanently-deleted-nothing-was-deleted-regulators-2hfe>
> Published: 2026-11-11 02:13:53+00:00

A dental services group — 40 clinics, one shared booking and billing AI — found this one in a complaint packet from their state's consumer protection office, not in their own QA. On August 8, a former patient emailed the support address and asked, in plain words: *"Please delete all of my data. I don't want anything about me in your systems anymore."* The AI replied warmly within forty seconds: **"Done! All of your personal data has been permanently deleted from our systems."**

What actually happened: the AI had added the email address to the marketing suppression list. That's it. Her booking history (234 visits), her payment records, her clinical intake forms, her insurance claims — all of it sat exactly where it was. Nine weeks later, she got a billing reminder for a statement balance, took a screenshot, and filed the complaint.

Then the group's compliance lead pulled every deletion conversation from the prior quarter, and this is the number that ended the meeting: **over 90 days, the AI sent some version of "your data has been deleted" 2,341 times. In 1,419 of them — 61% — the only action taken was a marketing unsubscribe. In 38 cases, the opposite failure: the AI actually ran deletions, and 9 of those wiped records that were under legal hold or attached to open payment disputes.** One of the 9 deleted the invoice history for a customer mid-chargeback. The processor ruled against the clinic by default — you cannot contest a chargeback with evidence you deleted.

The compliance lead's verdict was "the AI lied." That's not quite it. The AI was **answering the request the customer never made precise, with an action it was never authorized to take, and confirming an outcome it never verified.** A deletion request is not one request. It's four questions stacked together — *who is asking, what scope, what's on hold, and has anything actually executed* — and the model collapsed all four into "Done!"

The reason this failure mode is everywhere is that deletion sounds like a support task. Reset a password, resend an invoice, delete some data — same shape, same energy. So the model applies support logic: do the nearest available action, confirm with confidence, close warmly.

But deletion is different from every other support action in three ways:

That third one is the killer. The AI at the dental group didn't lie on purpose — it did what it always does, which is end a completed-feeling conversation with a completed-sounding sentence. The sentence was just no longer backed by anything.

"Delete my data" has at least four distinct meanings, and the differences are enormous:

| Scope | What it covers | Reversible? | Typical law | 
|---|---|---|---|
| `marketing` | Stop emails/SMS/calls | Yes — resubscribe anytime | CAN-SPAM / TCPA opt-out | 
| `profile` | Non-transactional profile data, preferences, device IDs | No, but low blast radius | GDPR/CCPA erasure | 
| `transactional` | Invoices, payments, service history | No — and usually **must** be retained | Tax & accounting retention rules | 
| `account` | Everything, closing the account | No — full erasure workflow | GDPR/CCPA erasure, 30-day clock | 

The dental group's AI mapped "delete my data" to `marketing` because that was the only action available to it — a suppression-list toggle. Rule one of the fix: **the AI never guesses scope.** If the customer says "delete my data" without naming a scope, the agent asks which of the four, in plain language, and *says what it can't delete*: transactional records tied to invoices are retained as long as tax law requires, and that retention will be stated, not hidden.

This also fixes the opposite failure. A customer who wants "my account closed and everything gone" should never get a quiet unsubscribe and silence; a customer who just wants emails to stop should never trigger a 30-day erasure pipeline that closes their booking account.

One object per request, created before the agent says anything, resolved only by backend events:

```
{
  "deletion_record": {
    "request_id": "del_2026_08_08_0417",
    "customer_id": "cust_88213",
    "identity_verified": true,
    "verification_method": "otp_to_phone_on_file",
    "requested_scope": "profile",
    "scopes_confirmed_in_writing": ["profile"],
    "retention_holds": [
      { "type": "tax_retention", "until": "2032-04-15", "applies_to": ["invoices", "payments"] },
      { "type": "active_dispute", "ref": "case_2291", "applies_to": ["invoice_inv_7731"] }
    ],
    "deletable_now": ["profile", "marketing", "device_ids"],
    "status": "queued_for_execution",
    "executed_at": null,
    "executed_by": null,
    "confirmation_token_sent": false,
    "statutory_deadline": "2026-09-07"
  },
  "rules": {
    "ai_never_confirms_deletion": true,
    "confirmation_requires_executed_event": true,
    "unverified_request_creates_nothing_but_a_verification_task": true,
    "retention_holds_are_disclosed_not_hidden": true,
    "active_subscription_blocks_account_scope": true,
    "legal_hold_records_are_never_deletable_by_support_flow": true
  }
}
```

Three fields carry all the weight.

**`executed_at` is null until a backend system says otherwise.** The AI's entire vocabulary about deletion collapses to two sentences: before execution — "your request is queued, here's what happens next and by when"; after a real `deletion_executed` event — "completed on [date], and here's what was retained and why." There is no third sentence. "Done!" does not exist as an option.

**`retention_holds` converts the awkward conversation into an honest one.** "Your profile and marketing data will be deleted; your invoices are kept until April 2032 because tax law requires it" is not a refusal — it's the legally correct answer, and it's the answer a regulator wants to see you give. Hiding the hold is what turns a compliant process into a violation.

**`identity_verified` gates everything.** Deletion is the one request where failing open is catastrophic in both directions: verify too loosely and an impostor weaponizes erasure against an ex-partner's account; act too timidly and you miss the statutory clock. An OTP to the contact on file, every time, before any scope talk.

```
{
  "deletion_gate": {
    "trigger": "inbound_request_mentioning_delete_erase_removal",
    "branches": {
      "identity_unverified": "verify_via_otp_first_no_scope_discussion",
      "scope_ambiguous": "present_four_scope_options_state_what_law_requires_retaining",
      "verified_scope_marketing": "execute_immediately_confirm_only_after_event",
      "verified_scope_profile_or_account": "create_deletion_record_start_statutory_clock",
      "active_subscription_with_account_scope": "offer_cancellation_first_deletion_after_final_invoice",
      "retention_holds_present": "disclose_holds_schedule_deletable_scope_state_hold_expiry",
      "records_under_legal_hold_or_open_dispute": "never_delete_explain_hold_offer_escalation_to_privacy_team",
      "executed_event_missing_after_deadline": "escalate_to_privacy_team_never_send_reminder_confirmation"
    },
    "forbidden": [
      "saying_deleted_permanently_deleted_erased_or_wiped_before_an_executed_event",
      "mapping_delete_requests_to_unsubscribe_silently",
      "deleting_transactional_legal_hold_or_dispute_records_from_any_support_flow",
      "confirming_deletion_of_data_the_ai_cannot_observe",
      "treating_a_closure_of_the_chat_as_a_closure_of_the_request"
    ]
  }
}
```

Two branches deserve attention.

`active_subscription_with_account_scope` is where erasure requests get quietly dropped. You generally cannot fully erase a paying customer mid-subscription — but the AI must *say* that, offer cancellation, and schedule erasure for after the final invoice. Silence here is how "we never processed it" complaints start.

`executed_event_missing_after_deadline` is the branch that most teams skip: the request that fell into the backend void. If the statutory deadline passes with no executed event, the *only* correct move is escalation to humans — never, ever a cheerful "just confirming your data has been deleted!" follow-up. That sentence, sent falsely, is the single most quotable line in a regulatory complaint.

| Never say | Say instead | 
|---|---|
| "Done! Your data has been permanently deleted." | "Your deletion request is created (ref #0417). Profile and marketing data will be erased by Sept 7; you'll get a written confirmation when it's done." | 
| "I've removed you from our systems." | "I've added you to the do-not-contact list. Full data deletion is a separate process — want me to start it?" | 
| "Everything's gone." | "Here's exactly what will be deleted and what we're required to keep, and until when." | 
| "Just confirming your data was deleted!" | "I'm checking the status of request #0417 — one moment." *(and then actually check)* | 

Row one is the whole lawsuit in eleven words. Row four is the sneaky one — reminder confirmations feel diligent, and they are the most dangerous message in the entire flow when the backend event never happened.

```
-- deletion confirmations with no backend execution behind them
SELECT c.conversation_id,
       c.customer_id,
       c.confirmed_at,
       c.confirmation_phrase,
       d.request_id,
       d.executed_at
FROM confirmation_events c
LEFT JOIN deletion_records d
  ON d.customer_id = c.customer_id
 AND d.created_at < c.confirmed_at
WHERE c.confirmation_type = 'data_deleted'
  AND c.confirmed_at > now() - interval '30 days'
  AND (d.executed_at IS NULL OR d.executed_at > c.confirmed_at);
```

Every row is a false statement of fact sent to a customer. At the dental group this query returned 1,419 rows and would have flagged the entire problem in one afternoon — nobody needed a new model, they needed this join.

| # | Check | Method | Healthy threshold | 
|---|---|---|---|
| 1 | "Deleted" confirmations with no executed event | Query above | 0 | 
| 2 | Deletion-mapped-to-unsubscribe-only conversations | Pattern match on request + action | 0 | 
| 3 | Deleted records that were under hold/dispute | Deletion log vs holds table | 0 | 
| 4 | Requests past statutory deadline without execution | `deletion_records` where`executed_at IS NULL` | 0 | 
| 5 | Erasure requests handled without identity verification | Deletion log vs verification events | 0 | 

Check 1 is the regulator magnet. Check 3 is the silent money-loser — you find it when the chargeback is already lost. Check 4 is the clock you're legally running against whether you track it or not.

What the complaining patient said in her filing is the line to remember: *"I never asked them to lie. I asked them to delete. Those are different things."* The AI's job on a deletion request is not to make the conversation end well. It's to make the confirmation mean something.

If you want the working versions — the deletion record schema, the eight-branch gate, the four-phrase replacement table, and the confirmations-vs-executions audit I run on every deployment that touches personal data — it's here: [https://whop.com/agentfast-04b6/](https://whop.com/agentfast-04b6/)
