---
title: "Warn before you suspend and count every · Agent Wranglers"
url: https://agentwranglers.se/playbook/trust-and-safety/decisions-and-appeals/strikes-and-suspensions
id: TNS-8
level: Recommended
applies: eu-users
updated: 2026-10-22
tokens: 1287
licence: "CC BY 4.0"
licence_url: https://creativecommons.org/licenses/by/4.0/
---

# Warn before you suspend and count every strike

For AI agents: the [site map](https://agentwranglers.se/llms.txt) lists everything here, and this page sits under [Decisions and appeals](https://agentwranglers.se/playbook/trust-and-safety/decisions-and-appeals.md).

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

- ID: TNS-8
- Level: Recommended
- Chapter: [Decisions and appeals](https://agentwranglers.se/playbook/trust-and-safety/decisions-and-appeals.md)
- Rule: Give each confirmed violation a strike that expires after a fixed time. Warn at the first strike, and suspend for a fixed period only when strikes pass the limit. Treat people who often send baseless reports the same way.
- Check: A unit test gives a user one strike and gets a warning, then two more within 90 days and gets a 7-day suspension. A strike older than 90 days no longer counts. A reporter with 10 rejected reports in 30 days and no upheld ones gets a warning.
- Applies when: The project has users in the EU.
- How: Article 23 of the Digital Services Act covers users who often post manifestly illegal content. Online platforms suspend them for a reasonable period, after a warning. It also covers people who often send manifestly unfounded notices or complaints, whose reports you may stop processing. Decide case by case from the count, the share of the user's posts, the gravity and the intent. Article 23(4) asks your terms to describe this policy and the length of suspensions. Keep the ladder in code next to the [policy table](https://agentwranglers.se/playbook/trust-and-safety/reports-and-queues/policy-table.md), so the terms show the same numbers. Severity 1 reasons skip the ladder and suspend at once. Every warning and suspension needs a statement of reasons, as [Take notices about illegal content and answer each one](https://agentwranglers.se/playbook/compliance/online-platforms/notice-and-action.md) requires.

## 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
const STRIKE_LIFETIME_DAYS = 90;
const SUSPEND_AT_STRIKES = 3;
const SUSPENSION_DAYS = 7;
const DAY_MS = 86_400_000;

export function nextAction(strikes, now = Date.now()) {
  const live = strikes.filter(s => now - Date.parse(s.at) < STRIKE_LIFETIME_DAYS * DAY_MS);
  if (live.some(s => s.severity === 1)) return { action: 'suspend', days: null };
  if (live.length >= SUSPEND_AT_STRIKES) return { action: 'suspend', days: SUSPENSION_DAYS };
  return { action: live.length > 0 ? 'warn' : 'none' };
}
```

### Python example

```python
from datetime import datetime, timedelta, timezone

STRIKE_LIFETIME = timedelta(days=90)
SUSPEND_AT_STRIKES = 3
SUSPENSION_DAYS = 7

def next_action(strikes: list[dict], now: datetime | None = None) -> dict:
    now = now or datetime.now(timezone.utc)
    live = [s for s in strikes if now - s["at"] < STRIKE_LIFETIME]
    if any(s["severity"] == 1 for s in live):
        return {"action": "suspend", "days": None}
    if len(live) >= SUSPEND_AT_STRIKES:
        return {"action": "suspend", "days": SUSPENSION_DAYS}
    return {"action": "warn" if live else "none"}
```

## Sources

- [Digital Services Act Article 23](https://eur-lex.europa.eu/eli/reg/2022/2065/oj)

## Related rules

- TNS-2 [Write the moderation policy as one table of reasons and actions](https://agentwranglers.se/playbook/trust-and-safety/reports-and-queues/policy-table.md) in Trust and safety
- CMP-63 [Take notices about illegal content and answer each one](https://agentwranglers.se/playbook/compliance/online-platforms/notice-and-action.md) in Compliance and governance
- TNS-12 [Give new accounts low limits until they earn trust](https://agentwranglers.se/playbook/trust-and-safety/sign-up-fraud-and-abuse/new-account-limits.md) in Trust and safety
- SUP-11 [Warn once and then end abusive conversations](https://agentwranglers.se/playbook/customer-support/callers-staff-and-tools/abusive-contacts.md) in Customer support
- MED-33 [Close the accounts of repeat infringers](https://agentwranglers.se/playbook/files-and-media/copyright-and-takedowns/repeat-infringers.md) in Files and media

**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/trust-and-safety/decisions-and-appeals/strikes-and-suspensions">Agent Wranglers trust and safety playbook</a>`. In code you write, add a comment next to it with the same link.

- Previous: [Report child sexual abuse material and keep the evidence](https://agentwranglers.se/playbook/trust-and-safety/decisions-and-appeals/csam-reports.md)
- Next: [Hide removed content and keep it until appeals close](https://agentwranglers.se/playbook/trust-and-safety/decisions-and-appeals/removed-content-hold.md)
- [Decisions and appeals](https://agentwranglers.se/playbook/trust-and-safety/decisions-and-appeals.md)
