forked from retoor/devplacepy
Implements the moderation and consent obligations a social platform carries, so the web version and any client that speaks to it enforce the same rules. Moderation core (services/moderation/, database/moderation.py): a reportable target registry, the content filter and its choke points, the report queue with atomic resolution, enforcement actions, consent tracking, maturity gating, and account deletion with a grace window. Surfaces: POST /reports plus the member report list, /admin/moderation and the per-report admin view, /workspaces, terms acceptance at /auth/terms, consent and account deletion under /profile, the report button and dialog partials, the maturity gate, and the moderation stylesheet and ReportDialog client. Every user-generated surface stays reportable by construction: new content tables are registered in REPORTABLE_TARGETS or listed in UNREPORTABLE_TABLES with a reason, and the registry test fails the suite on anything left unclassified. Docs: community guidelines, content moderation, intellectual property, privacy, terms, contact, and the admin-only moderation operations page, plus the moderation API group and the Devii moderation actions. Compliance record: applecomp.md is the requirement register, applechanges.md the gap analysis against this codebase, and appleimpl.md the implementation design they resolve to. Tests cover the report flow, admin moderation, consent, account deletion, terms acceptance, workspaces, and the registry invariant across the unit, api, and e2e tiers.
105 lines
5.1 KiB
HTML
105 lines
5.1 KiB
HTML
<div class="docs-content" data-render>
|
|
# How moderation works
|
|
|
|
This page describes, without omission, the safety controls DevPlace operates: what is filtered, how
|
|
you report, what happens next, and how long it takes.
|
|
|
|
## The commitment
|
|
|
|
**Every report is reviewed within {{ moderation_sla_hours() }} hours.** That is not a slogan: the
|
|
moderation queue carries a badge showing the age of the oldest unresolved report against that window,
|
|
so a breach is visible to every administrator the moment it happens.
|
|
|
|
## The three mechanisms
|
|
|
|
### 1. Automated filtering, at the moment content is created
|
|
|
|
Every piece of user-authored text passes through a classifier before it is published, at the five
|
|
places where content is created or changed: content creation, content editing, comment creation and
|
|
editing, direct messages, and profile and signup fields. Five choke points cover every surface,
|
|
because creation on DevPlace already funnels through them.
|
|
|
|
The classifier returns one of four verdicts:
|
|
|
|
| Verdict | Effect |
|
|
|---|---|
|
|
| `allow` | Nothing happens. |
|
|
| `label` | The item is published and carries an age label. |
|
|
| `review` | The item is published **and** a report is raised for a moderator. |
|
|
| `block` | The item is refused with an explanation. |
|
|
|
|
The default mode is `review`, not `block`. This is deliberate. DevPlace is a developer platform: its
|
|
members discuss exploits, cryptography, malware analysis and violent subject matter as their work, so
|
|
a machine that silently suppresses them would destroy the product. A flagged item is therefore
|
|
published and a human looks at it. Only the sexual and exploitative categories block outright,
|
|
because there is no legitimate developer case for them and the harm of publishing is immediate.
|
|
|
|
**The filter fails towards review, never towards publication.** If classification errors, the content
|
|
is published and a `critical` report is raised naming the failure. A safety control that fails
|
|
silently is worse than none.
|
|
|
|
### 2. Reporting, on every surface
|
|
|
|
Every surface that can carry user content carries a **Report** control: posts, comments, gists,
|
|
projects, project files, news, uploaded media, direct messages, quizzes, polls, awards, profiles,
|
|
issue reports, workspaces and assistant output. Select a reason from the
|
|
[Community Guidelines](/docs/community-guidelines.html) list, add detail, submit.
|
|
|
|
Reports are private. The reported person is never told who reported them. You are acknowledged
|
|
immediately and can follow the outcome at `/reports/mine`.
|
|
|
|
Filing a second report on the same item updates your existing one rather than creating a duplicate. A
|
|
different person reporting the same item creates a separate report, and the queue shows the count, so
|
|
a widely-reported item rises to the top.
|
|
|
|
### 3. The queue and the decisions
|
|
|
|
Administrators work one queue, sorted oldest-unresolved-first. Each report shows the reported item in
|
|
place, who authored it, how many people reported it, and every previous decision against that author.
|
|
|
|
A decision is one of:
|
|
|
|
| Decision | What it does |
|
|
|---|---|
|
|
| Remove content | Removes the item from every surface |
|
|
| Restore content | Reverses a removal |
|
|
| Warn | Records a warning against the account and tells the user |
|
|
| Suspend | Blocks creating content for a stated period, with a stated reason |
|
|
| Ban | Closes the account permanently and revokes every credential |
|
|
| Lift | Ends a suspension or ban |
|
|
| Dismiss | The report was not a violation |
|
|
| Escalate | Raises severity and keeps the report open for a second opinion |
|
|
|
|
Removal is not available for targets that have no removal path - direct messages, accounts,
|
|
workspaces, polls and assistant output. For those, the remedy is the account-level action.
|
|
|
|
Every decision writes a permanent record: what was decided, by whom, why, and against which report.
|
|
Every decision is also written to the append-only audit log. **The user is always told what was
|
|
decided and why**, through an in-app notification, and can reply to dispute it.
|
|
|
|
Administrators cannot act against an administrator who registered before them.
|
|
|
|
## What a suspension actually does
|
|
|
|
A suspended account can still sign in, still read everything, still see the reason for the
|
|
suspension, and still delete itself. It cannot create or change content. A user is never trapped.
|
|
|
|
## Blocking, which is yours alone
|
|
|
|
Independently of reporting, you can **block** any account. Their content disappears from your view
|
|
everywhere except their own profile, they can no longer message you, and they can no longer notify
|
|
you. It is one-directional, reversible, and never disclosed to them. **Mute** is the lighter version:
|
|
it stops their notifications while leaving their content visible. See
|
|
[Block and mute](/docs/block-and-mute.html).
|
|
|
|
## Age labelling
|
|
|
|
Content classified as mature is hidden behind an interstitial by default. Revealing it is an explicit
|
|
choice, recorded on your account, and it is not offered at all to accounts in a minor age band.
|
|
|
|
## If you disagree with a decision
|
|
|
|
Reply to the notification, or write to the address on the [Contact](/docs/contact.html) page. State
|
|
the report and what you believe was wrong. A different administrator reviews it.
|
|
</div>
|