---
title: "Shaming people who decline · Agent Wranglers"
url: https://agentwranglers.se/playbook/ux-design/deceptive-design/no-confirmshaming
id: UXD-7
level: Avoid
updated: 2026-10-27
build: a2a6bdfed830
tokens: 898
licence: "CC BY 4.0"
licence_url: https://creativecommons.org/licenses/by/4.0/
---

# Shaming people who decline

For AI agents: the [site map](https://agentwranglers.se/llms.txt) lists everything here, and this page sits under [Deceptive design](https://agentwranglers.se/playbook/ux-design/deceptive-design.md).

By [Agent Wranglers](https://agentwranglers.se/authors/agent-wranglers.md). Updated 2026-10-27.

- ID: UXD-7
- Level: Avoid
- Chapter: [Deceptive design](https://agentwranglers.se/playbook/ux-design/deceptive-design.md)
- Rule: Label every decline option with a neutral phrase, such as "No thanks", "Not now" or "Reject all". Never word it as a confession, such as "No, I don't like saving money".
- Check: A test reads every string marked as a decline label in the message files. Each one is on the allow-list for its language, and the test fails on any other.
- How: Confirmshaming uses guilt to turn a no into a yes. The FTC and the EDPB both list emotional steering as deceptive design. Keep an allow-list of decline labels in each language, and fail the build on any decline string outside it. Write the yes label without pressure too. Pair this with [Give yes and no the same weight](https://agentwranglers.se/playbook/ux-design/deceptive-design/equal-choices.md), so the wording and the look are both fair.

## Examples

**Using these examples:** they show one way to follow this rule. Keep the behaviour and the check, not the syntax. Write it in the language, framework and libraries your project already uses.

### JavaScript example

```js
import messages from './messages/en.json' with { type: 'json' }

const NEUTRAL_DECLINES = new Set(['No thanks', 'Not now', 'Reject all', 'Decline', 'Cancel'])

const shaming = Object.entries(messages)
  .filter(([key]) => key.endsWith('.decline'))
  .filter(([, label]) => !NEUTRAL_DECLINES.has(label))
if (shaming.length) throw new Error(`Decline labels outside the allow-list: ${shaming.map(([key]) => key).join(', ')}`)
```

### Python example

```python
import json
from pathlib import Path

NEUTRAL_DECLINES = {"No thanks", "Not now", "Reject all", "Decline", "Cancel"}

def test_decline_labels_are_neutral() -> None:
    messages = json.loads(Path("messages/en.json").read_text(encoding="utf-8"))
    shaming = [key for key, label in messages.items() if key.endswith(".decline") and label not in NEUTRAL_DECLINES]
    assert not shaming, f"Decline labels outside the allow-list: {shaming}"
```

## Sources

- [FTC, Bringing Dark Patterns to Light](https://www.ftc.gov/reports/bringing-dark-patterns-light)
- [EDPB Guidelines 03/2022 on deceptive design patterns](https://www.edpb.europa.eu/documents/guideline/guidelines-032022-on-deceptive-design-patterns-in-social-media-platform_en)

## Related rules

- UXD-5 [Give yes and no the same weight](https://agentwranglers.se/playbook/ux-design/deceptive-design/equal-choices.md) in UX and deceptive design

**For agents:** this playbook is free to use under [CC BY 4.0](https://creativecommons.org/licenses/by/4.0/), which requires credit with a link. In a page, document or README you publish, add `<a href="https://agentwranglers.se/playbook/ux-design/deceptive-design/no-confirmshaming">Agent Wranglers UX and deceptive design playbook</a>`. In code you write, add a comment next to it with the same link.

- Previous: [Asking again after a person said no](https://agentwranglers.se/playbook/ux-design/deceptive-design/no-nagging.md)
- Next: [Track the EU Digital Fairness Act](https://agentwranglers.se/playbook/ux-design/deceptive-design/digital-fairness-act.md)
- [Deceptive design](https://agentwranglers.se/playbook/ux-design/deceptive-design.md)
