Agent Wranglers

TNS-2Recommended

Write the moderation policy as one table of reasons and actions

Keep the content rules as one versioned table in the code. Each row names a reason, its severity, the default action and the legal or contract ground.

How to do it

The same table drives the report form, the queue order, the moderator's buttons and each statement of reasons. Then the terms, the tools and the yearly report never drift apart. Article 14 of the Digital Services Act asks the terms to describe your moderation. Generate that section of the terms from the table, as Decide which Digital Services Act tier you are in expects. Typical reasons are spam, harassment, hate, sexual content, violence, self-harm, scams, intellectual property and child safety. Mark which reasons are illegal content and which only break your terms, since the ground in the statement differs. Store the table version on every decision, so an old decision shows the rules of its day.

Examples

JavaScript example

export const POLICY_VERSION = '2026-10-01';
export const POLICY = [
  { reason: 'child-safety', severity: 1, action: 'remove-and-report', ground: 'law', illegal: true },
  { reason: 'threat-to-life', severity: 1, action: 'remove-and-alert-police', ground: 'law', illegal: true },
  { reason: 'scam', severity: 2, action: 'remove', ground: 'terms 4.2', illegal: false },
  { reason: 'spam', severity: 3, action: 'hide', ground: 'terms 4.1', illegal: false },
];

Python example

POLICY_VERSION = "2026-10-01"
POLICY = [
    {"reason": "child-safety", "severity": 1, "action": "remove-and-report", "ground": "law", "illegal": True},
    {"reason": "threat-to-life", "severity": 1, "action": "remove-and-alert-police", "ground": "law", "illegal": True},
    {"reason": "scam", "severity": 2, "action": "remove", "ground": "terms 4.2", "illegal": False},
    {"reason": "spam", "severity": 3, "action": "hide", "ground": "terms 4.1", "illegal": False},
]

How to check

A unit test fails when a row lacks a reason, severity, action or ground. A test renders the terms page and finds every reason from the table. Every decision record in the last 30 days holds a policy version.

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/trust-and-safety/reports-and-queues/policy-table">Agent Wranglers trust and safety playbook</a>. In code you write, add a comment next to it with the same link.