Files
runicgateway.com/src/content/docs/docs/administration/moderation.mdx
wtclaude f499f2b72b
All checks were successful
PR checks / checks (pull_request) Successful in 9m25s
docs(journey): phase 7 — the installation path and administration
Twenty documentation pages: Getting started (7) and Administration (13), the
journey no existing document owns end to end because the repositories are
organised by component and an operator is not.

Four decisions of record, taken before anything was written (D34–D37, PLAN.md
§10 "How phase 7 built the documentation journey"):

- D34 one PR for all twenty pages.
- D35 the install page is SELF-CONTAINED: it prints a complete Compose file and
  a complete .env that an operator copies without visiting another repository.
  That is a copy of somebody else's file, so it is checked rather than trusted —
  scripts/checkQuickstart.mjs re-reads website main:docker-compose.yml and
  main:.env.example over the Gitea API and fails on any disagreement, in both
  directions: a value that drifts fails, and a service or variable that appears
  upstream fails until it is either included or recorded as deliberately omitted
  with a reason. Its first run found two stale entries.
- D36 every Administration screen was walked on a real deployment before it was
  described — the rig being the quickstart itself, against the published image,
  so one run proved the install page and produced the detail the admin pages
  needed.
- D37 a thirteenth Administration page, Content, so that every admin nav row has
  a home without organising the docs by the app's menu.

What the live deployment disproved, all three now documented:

- The documented Compose deploy does not boot. SECRET_ENC_KEY is required in
  production (utils/secretBox.js throws at require time) and is missing from
  website's ROOT .env.example — the file Compose reads. It is present in
  server/.env.example, which is why dev never hits it. The quickstart carries it,
  declared as an upstream omission so the check fails the day it is fixed.
- The installer points operators at a screen that no longer exists: it prints
  <site>/admin/shard, and INSTALL.md §5 repeats it, but since the module cutover
  the screen is /admin/uo/link. Both the binary and the guide are stale.
- The admin Restart button opens a window.confirm whose text is the honest
  warning that a deployment with no supervisor does not come back — which is why
  `restart: unless-stopped` is called out as load-bearing rather than left as
  boilerplate.

And the defect only a look found, three phases running: the .env block's prose
promised that every highlighted line must be changed, while `mark` given the
variable names highlighted the names alone and left the values unmarked. Every
check passed on a page that was wrong about its own highlighting.

verify green: 890 internal links, 52 branch links, 19 facts, 59 quickstart
checks, 0 astro-check errors.

Co-Authored-By: Claude <noreply@anthropic.com>
2026-08-24 08:35:03 -05:00

69 lines
3.0 KiB
Plaintext

---
title: Moderation
description: Three screens that do three different jobs — Discord moderation, content reports, and appeals against a sanction.
---
import { Aside } from '@astrojs/starlight/components';
The **Moderation** group in the sidebar holds three screens that are easy to confuse and do
not overlap.
| Screen | Is about | Comes from |
|---|---|---|
| **Moderation** | Your **Discord** guild — bans, kicks, mutes, warnings, joins, leaves, filter and spam hits | the bot, captured live |
| **Reports** | **Team forum content** members have reported | the site |
| **Appeals** | Sanctions people are asking you to reverse | the site |
## Moderation (Discord)
Counts across a window you choose — 24 hours, 7 days, 30 days — for bans, kicks, mutes,
warnings, joins, leaves, filter hits and spam hits, with a filterable list of recent
actions and a tabbed event log (members, filter hits, spam hits).
Everything here arrives from the Discord bot, so a site with no bot configured shows zeros
and empty lists rather than an error. Setting the bot up is
[Notifications and email](/docs/administration/notifications-and-email/).
**Look up** takes you to a per-user view when you are investigating one account rather than
browsing the window.
## Reports
Reports raised by members about Team forum content. Two design decisions show through in
how this screen behaves:
- **They come to site staff, and a Team's own leaders never see them.** A leader moderates
their own forum, so a report *about a leader* has to reach someone above them.
- **Handling a report records a decision about the report.** It does not touch the content:
hiding or removing a post is done in the forum, or as a sanction against the account.
The filters are *Open*, *Reviewing*, *Actioned*, *Dismissed* and *All*, and the count of
open reports sits at the top so the screen is glanceable.
<Aside type="note" title="Dismissing is a real outcome, not a failure to act">
A report that was not a problem should be dismissed rather than left open — an open queue
that never empties stops being read, and the reporter's next report is the one that
matters.
</Aside>
## Appeals
An appeal is a request to reverse a sanction, filtered by *Open*, *Pending*, *Under
review*, *Approved*, *Denied*, *Withdrawn* or *All*. Each row carries the target, the
action being appealed, the appeal itself, who submitted it, its age and whether a reversal
happened.
Two things worth building a habit around:
- **Age is the column that matters.** An appeal that nobody has looked at for three weeks
is a worse outcome than a denial.
- **The decision is recorded either way.** Approving an appeal records the reversal, so the
history explains itself later without anyone having to remember.
## What is recorded, and where
Every staff action lands in **Admin → Activity** — who did what, from which address, when.
That log is the thing to read when reconstructing a disputed decision, and it is a record
rather than a workflow: nothing is actioned from it. See
[Content](/docs/administration/content/).