# Moderation decisions are transparent

- **Pattern:** `ab-000711` (`community-moderation-safety.policy-transparency.moderation-transparency`)
- **Severity:** medium
- **Lifecycle:** active
- **Last modified:** 2026-04-18
- **Canonical URL:** https://auditbuffet.com/patterns/ab-000711
- **License:** CC-BY-4.0 — attribute to AuditBuffet Pattern Catalog (https://auditbuffet.com/patterns/ab-000711)

## Why it matters

When content disappears silently — no email, no notification, no reason given — users experience it as arbitrary punishment. DSA Art. 17 requires that platforms communicate content removal decisions to affected users with the reasons cited. Beyond compliance, transparent moderation builds user trust: users who understand why content was removed can correct behavior, appeal wrongful decisions, or accept enforcement as legitimate. Platforms that hide moderation reasoning generate more appeals and more user churn than those that explain decisions clearly.

## Severity rationale

Medium because silent moderation actions create DSA compliance exposure and drive user churn through perceived arbitrariness, but do not directly expose data or enable attacks.

## Remediation

Send notifications whenever moderation actions are taken against a user's content. Extend `src/lib/moderation.ts` to trigger a notification on every enforcement action:

```typescript
async function notifyModerationAction(
  userId: string,
  action: 'removed' | 'hidden' | 'warned',
  reason: string,
  category: string
) {
  await db.notifications.create({
    userId,
    type: 'moderation',
    title: `Your content was ${action}`,
    body: `Reason: ${reason} (${category}). Review our community guidelines or submit an appeal.`,
    createdAt: new Date(),
  });
  // Also send email if user has email notifications enabled
}
```

A generic 'content removed' notice without a stated reason does not satisfy this check — the notification must include both the reason and the violation category.

## Detection

- **ID:** `moderation-transparency`
- **Severity:** `medium`
- **What to look for:** Check if users are notified when content is removed or actions are taken. Look for notification emails, in-app messages, or dashboard alerts. Verify that the reason for removal is communicated.
- **Pass criteria:** When content is removed or a user is punished, they receive a notification (email, in-app, or dashboard alert) that includes at least 2 pieces of information: the reason for the action and the violation category. On pass, enumerate all notification channels used (email, in-app, push) and report the ratio of moderation actions that trigger notifications.
- **Fail criteria:** Users are not notified of moderation actions. Content disappears silently. A generic "content removed" notice without a reason does not count as pass.
- **Skip (N/A) when:** Platform has fewer than 100 active users or is internal-only with no external accounts.
- **Detail on fail:** `"When posts are deleted, users receive no notification. They have no idea why their content was removed."`
- **Remediation:** Send users notifications when their content is removed. Add to `src/lib/moderation.ts`:

  ```javascript
  async function notifyUser(userId, action, reason, category) {
    await db.notifications.create({
      userId, type: 'moderation',
      title: `Content ${action}`,
      body: `Your content was ${action} for: ${reason} (${category})`,
      createdAt: new Date()
    });
  }
  ```

## External references

- external DSA-Art17 — https://eur-lex.europa.eu/legal-content/EN/TXT/?uri=CELEX%3A32022R2065

Taxons: user-experience, content-integrity

HTML version: https://auditbuffet.com/patterns/ab-000711
