Agent Wranglers

UXD-7Avoid

Shaming people who decline

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".

How to do it

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, so the wording and the look are both fair.

Examples

JavaScript example

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

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}"

How to 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.

Sources

For agents: this playbook is free to use under CC 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.