# Ananta Café · Moderator Handbook

A practical guide to caring for the café, using Taffy, and leaving a clear record for the next moderator.

Reviewed 17 October 2026 against Taffy's moderation, Moderator Hall, case storage and ModMail implementation. Public reference; moderation tools remain restricted to authorized staff. This is an operating guide: server rules and decisions from the server owner/admin team take priority. The example sanctions below demonstrate the controls; they are not a mandatory punishment ladder.

## Contents

1. Start here: judgement before buttons
2. Using Moderator Hall
3. Giving a warning
4. Removing warnings and recording corrections
5. Timeouts and duration formats
6. Kicks, bans and unbans
7. Keeping a channel under control
8. Reasons, evidence and staff comments
9. ModMail and appeals
10. Handling common situations
11. Permissions and troubleshooting
12. Quick reference and shift handover

<!-- chapter: Start here -->
## 01 · Judgement before buttons

Your job is to stop harm, explain the boundary and help the conversation recover. Keep your tone calm, especially when the other person isn't calm.

### Before taking action
1. Read the surrounding conversation. Check who said what, when it happened, and which server rule applies. A report is a starting point, not proof by itself.
2. Verify the person using their Discord user ID. Similar names and profile pictures can belong to different people. Turn on Developer Mode in Discord settings to access Copy User ID.
3. Preserve the minimum useful evidence: message links, channel, time and a short factual summary. If content must be removed immediately, contain the incident first and record what you safely can.
4. Check Warnings and Case history in Moderator Hall. A missing result does not prove there was never an incident: views are limited and older records may have expired under retention settings.
5. Coordinate with the moderator already handling it. Avoid two warnings or overlapping sanctions for the same conduct.
6. Choose a proportionate response. A quiet reminder may resolve an honest mistake; an ongoing attack may need immediate containment. You do not have to warn before every serious safety action.

### While acting
Use an observable reason, verify the target and settings, then read Taffy's final receipt. Save the case number in the staff handover. A loading message is not a completed action.

### After acting
Check that the harm stopped. Explain what needs to change without arguing in public. Offer a private route for questions and appeals. If you were personally involved, ask another moderator to review the decision.

Taffy does not automatically ban someone after a particular warning count. Do not invent a three-strikes rule. Apply the server's actual policy and consider severity, context and relevant history.

<!-- chapter: Moderator Hall -->
## 02 · Using Moderator Hall

Use the original control panel in this channel, or run `/modhall` to open your own private copy. Clicking a tool does not grant permission to use it.

### Member tools
- Member care: Warn, Warnings, Reset warnings, Case history.
- Access & safety: Timeout, Remove timeout, Kick, Ban, Unban.
- Channel controls: Slowmode, Clear messages, Lock channel, Unlock channel.

### A member action, step by step
1. Choose the action.
2. Search the member picker, or paste the person's 17–20 digit Discord user ID. Use one method; if you fill both, they must identify the same person.
3. Enter a useful reason. Add a duration or other options when the form asks for them.
4. Submit the form to prepare a private review.
5. Check the identity and user ID, action, reason, duration, and any message deletion window. For channel tools, check the selected channel explicitly.
6. Choose Confirm only when everything is correct. Otherwise Cancel and start again.
7. Wait for the completed receipt and case number before treating the action as done.

Warnings and Case history are read-only lookups and return without a confirmation. Every Hall action that changes something has a final confirmation. A review expires after five minutes and belongs to the moderator and channel that opened it. Other staff cannot confirm your review.

### Search and history details
Unban uses a pasted ID. Ban can target a valid user ID even if the person has left. Most other member actions require the person to still be in the server; warning resets can also target former members.

Hall history lists the latest eight matching cases; Warnings also displays the active warning count. Use `/case number:42` to read a retained case's full reason. Replace 42 with the actual case number.

An old or copied Hall panel may be rejected. Open `/modhall` again. If a previous action's result is uncertain, check history and the member's current state before starting another action.

<!-- chapter: Giving a warning -->
## 03 · Giving a warning

A warning is a recorded explanation of a rule breach. It should tell the member what happened and what to change, without insults or speculation.

### Recommended workflow
1. Verify the member, context, evidence and rule.
2. Check existing warnings and recent cases. Make sure another moderator hasn't already handled this incident.
3. In Hall, choose Warn, find the member and write the reason.
4. Review the user ID and reason, then confirm once.
5. Read the receipt and record the case number. Taffy tries to DM the member the warning and reason.

Slash alternative:
`/warn member:@Member reason:Repeated personal insults in general after a reminder to stop. Please address the discussion without attacking other members.`

The member mention is a placeholder: select the real member in Discord. A slash warning runs when submitted; it does not open the Hall's final review screen.

### Useful reasons
- "Repeated off-topic promotion after a moderator reminder. Keep advertising to the channels allowed by the rules."
- "Continued targeted insults after being asked to stop. Disagree without attacking another member."

Avoid "bad attitude", "because I said so", or a list of private allegations. State the conduct and expected change. Put sensitive evidence and internal discussion in a separate private staff note.

Reasons are optional in the form and command, up to 500 characters. Blank reasons become "No reason provided." For proper staff records, fill the reason in.

### Checking the result
Use Hall → Warnings or `/warnings member:@Member`. The slash view shows up to 15 active warnings; it is not a complete lifetime record. Use `/case number:42` for the full stored reason.

If the receipt says the DM was not delivered but the case was saved, the warning already exists. Do not warn again to retry the DM. If appropriate, communicate the boundary through an existing private staff conversation.

If Taffy says the warning was not saved and no DM was sent, ask the bot owner to investigate before deciding whether to try again.

<!-- chapter: Removing warnings -->
## 04 · Removing warnings and correcting mistakes

Read this before using Reset warnings: it clears ALL active warnings for the selected person. It does not remove one chosen case.

Taffy currently has no single-warning removal command, no `/unwarn`, and no editable case-comment field. A reset creates a new reset-warnings case with your reason. Previous cases remain available in history until the configured retention period removes them.

### If the only active warning is wrong
1. Open Warnings and read the original case with `/case`.
2. Verify the user ID, active count and evidence. Coordinate with the original moderator or an admin when possible.
3. Choose Reset warnings for that person.
4. Explain the correction in the Reason field, including the original case number and who reviewed it.
5. Check the private review says the correct person and count, then confirm once.
6. Reopen Warnings to verify the count. Record the new reset case and the original case in the handover.

Example reset comment:
"Correction for case 42: wrong member selected. Only one active warning existed; reviewed with AdminName. Reset approved."

Use a real reviewer only if that review actually happened. Taffy does not send a member DM for a warning reset; explain the correction separately when appropriate.

### If one warning is wrong but others are valid
Do not use Reset warnings as a substitute for removing that one warning. It would clear the valid warnings too. Ask an admin to review, and leave a linked correction in the private incident record or ModMail note. Make the disputed case and decision easy for future staff to find. Do not automatically reissue valid warnings: that creates new cases, dates and notifications.

### If the team approves a complete reset
Review every active warning, document the scope and approval, then use the Hall reset. Check for concurrent staff actions before confirming: the reset covers all warnings active when it completes, not just the ones you first saw.

### Adding comments without changing a case
In a relevant ModMail ticket, use `/mail note text:Case 42 reviewed; correction requested because ... Decision: ... Reviewed by ...`

That is a separate staff-only ticket note, not an edit to case 42. Outside a ticket, post the same structured handover in a private staff channel. Deleting a log message does not remove the warning.

<!-- chapter: Timeouts -->
## 05 · Timeouts and duration formats

A timeout temporarily restricts a member's communication. Choose a duration that fits the incident and the server's policy; the examples here show syntax, not a fixed sanction schedule.

### Applying or ending a timeout
Hall → Timeout → choose member → duration → reason → review → Confirm.

Slash alternative:
`/timeout member:@Member duration:1h30m reason:Continuing targeted insults after a warning; pause the conversation and review the rules before returning.`

To end it early, use Hall → Remove timeout, or:
`/untimeout member:@Member reason:Reviewed on appeal; timeout ended early after correction of the incident record.`

Check the existing timeout and coordinate before replacing or ending it. Enter a reason for the change. Discord enforces timeout expiry automatically; it does not depend on Taffy staying online.

### Duration syntax
- `s` seconds, `m` minutes, `h` hours, `d` days, `w` weeks.
- `1m`, `2h`, `1d`, `1w`, `1h30m` and `1h 30m` are valid formats.
- Use whole-number parts. Write `1h30m`, not `1.5h` or `one hour`.
- Stay within the limit for the specific tool. `1m` is a minute; there is no month unit.

### Limits
- Timeout: 1 minute–28 days, in whole minutes. Use Remove timeout to end it; `0` is not the timeout-removal control.
- Temporary ban: 1 minute–365 days. Leave duration blank for a permanent ban.
- Slowmode: 1 second–6 hours. `0` or `off` disables it.
- Ban message deletion window: 1 hour–7 days, in whole hours. Blank, `0` or `off` keeps messages.

You cannot timeout the server owner or an Administrator. Taffy also checks permissions and role hierarchy. An unavailable action is a reason to ask an admin, not to try to bypass the safeguard.

<!-- chapter: Kicks and bans -->
## 06 · Kicks, bans and unbans

### Kick
A kick removes the member. It has no duration and does not prevent them from rejoining with a valid invite.

Hall → Kick → member → reason → review → Confirm.
`/kick member:@Member confirm:true reason:Continued disruption after staff intervention; reviewed under the server rules.`

### Ban
A ban prevents the account from joining until unbanned. In Hall you can select a current member or paste a valid user ID, including someone who has left.

Check two separate settings:
1. Ban duration: blank means permanent; a value such as `7d` schedules an automatic unban.
2. Remove recent messages: blank or `0` keeps messages; `1d` removes the account's recent messages within that window. This deletion cannot be undone.

Example temporary ban, preserving messages:
`/ban member:@Member confirm:true duration:7d delete_window:0 reason:Repeated targeted harassment; evidence reviewed and action approved under server policy.`

Taffy's temporary-ban worker performs the automatic unban while the bot is online. An outage can delay it. Check the ban state if an expiry has passed; do not promise an exact return time during an outage. A permanent ban has no scheduled expiry.

Preserve necessary evidence before selecting message deletion. Do not select seven days of deletion by habit. A ban is an access decision; removing messages is a separate decision.

### Unban
Use Hall → Unban and paste the Discord user ID, or:
`/unban user_id:USER_ID reason:Appeal reviewed by AdminName; return approved with the server rules explained.`

Replace USER_ID with the actual 17–20 digit ID. Unbanning does not automatically rejoin the person, remove warnings or reverse message deletion. Tell them the outcome through an appropriate private route.

### Confirmation and notification
Slash Kick and Ban require `confirm:true` and execute on submission. Hall gives a separate review screen. Taffy attempts a DM for kicks; do not assume a ban includes a delivered DM. Check receipts and communicate the decision when appropriate.

<!-- chapter: Channel controls -->
## 07 · Keeping a channel under control

Hall channel tools ask you to select a channel. The equivalent slash commands act in the channel where you run them. Check this before submitting anything.

### Slowmode
Use it to reduce message speed while keeping discussion open.
`/slowmode duration:10s reason:Temporary pacing while staff resolve an argument.`
`/slowmode duration:off reason:Discussion settled; normal pacing restored.`

Range: 1 second–6 hours. Slowmode is not a timeout or a full channel lock. Some permissions allow members to bypass it. Record the previous setting if you plan to restore it later; disabling it does not restore an earlier nonzero value.

### Clear messages / purge
Hall → Clear messages → choose channel → count from 1–100 → reason → review → Confirm.
`/purge count:20 confirm:true reason:Removing the recent spam burst after preserving the incident references.`

The count is how many recent messages to inspect, not a promise to delete exactly that many. Taffy preserves pinned messages and messages over two weeks old. Purge removes eligible messages from anyone in that range, not only the reported account. Review the channel first. Deleted content cannot be restored by undoing the command.

### Lock and unlock
`/lock reason:Containing an active raid while staff review access.`
`/unlock reason:Incident contained; restoring the saved channel send permission.`

A Taffy lock changes @everyone's Send Messages permission. Other role/member overrides may still allow messages. It is not a universal lock on every role, voice room or thread. Ask an admin for a broader incident response if needed.

Unlock restores the exact @everyone send-permission state saved by Taffy's lock. If another person changed permissions meanwhile, Taffy can stop and request review. Do not repeatedly unlock or overwrite permissions blindly. Coordinate with an admin and preserve the saved recovery state.

After any channel intervention, check the actual result, explain the temporary restriction briefly, and arrange who will review or restore it. Do not leave emergency settings unattended at the end of your shift.

<!-- chapter: Notes and evidence -->
## 08 · Reasons, evidence and staff comments

Keep the member-facing explanation separate from sensitive staff discussion.

### Action reason
Use: conduct + context/rule + expected change or decision.
"Repeated personal insults in general after a reminder. Stop targeting other members and keep disagreements about the topic."

Warn, timeout, remove-timeout and kick reasons are sent in Taffy's attempted member DM. They are not private staff comments. Do not include reporter identities, confidential evidence, personal details or speculation in that field.

### Private incident note
Use a relevant ModMail `/mail note`, or a private staff-channel handover. Taffy does not currently attach editable comments to a moderation case. Link the separate note to the case number and member ID so another moderator can follow it.

Copy and fill this template:
```
Member ID:
Case number(s):
Incident time and channel:
Rule / observed conduct:
Evidence links / restricted evidence location:
Action and reason:
Review or approval, if any:
Member notified? Delivery issue?
Next step / reviewer / review time:
```

Include only what another moderator needs to understand the decision. Keep evidence in authorized staff spaces. Never ask for passwords, account tokens or unrelated personal documents.

### Corrections and follow-up comments
"Follow-up to case 42: original message context reviewed. Finding: ... Decision: ... Action taken / reset case: ... Reviewed by: ..."

Clearly distinguish an allegation, what you observed, and the review outcome. Do not claim approval that has not happened. If the outcome changes, add a dated follow-up rather than quietly rewriting the story in staff chat.

### Retention and evidence limits
Taffy case history and locally stored transcripts are subject to configured retention. A warning reset preserves earlier cases only while they remain retained. Discord copies and separate staff messages have their own availability; deleting a local record does not guarantee every copy disappears.

A message link can stop working after deletion. Keep the minimum allowed evidence needed for review, without spreading harmful material or retaining unnecessary sensitive content.

<!-- chapter: ModMail and appeals -->
## 09 · ModMail and appeals

Use private support for questions, reports and appeals. A member can open ModMail through the staff desk or message Taffy. A respectful appeal is not itself misconduct.

### A safe ticket workflow
1. Read the ticket header and existing conversation before replying.
2. Use `/mail claim` to take responsibility, and coordinate if someone already owns the conversation.
3. Ask for the case number, relevant message links and a concise explanation. Do not demand unrelated personal information.
4. Read the original case and evidence. If your own action is being appealed, ask another moderator or admin to review it.
5. Explain the outcome: upheld, shortened, reversed, or awaiting review. State only actions that have actually been completed.
6. Leave an internal note linking the appeal and any new case. Use `/mail release` for a handoff, or close with a clear reason when the conversation is finished.

### Replies versus internal notes
`/mail reply text:Thanks for explaining. We are reviewing case 42 and the surrounding conversation. We will reply here once that review is complete.`

`/mail note text:Appeal for case 42. Evidence reviewed: ... Proposed outcome: ... Assigned reviewer: ...`

The note command is staff-only. The reply command goes to the member. Do not confuse them.

Some ticket channels enable automatic relay: their header says "Type here to reply. Use // for staff-only notes." In those channels, ordinary staff messages can be forwarded to the member. Use `/mail note` for internal discussion; use the `//` prefix only where the header confirms that workflow. Read the header every time.

### Closing and records
`/mail close reason:Appeal reviewed and outcome explained; no further questions pending. confirm:true`

`/mail transcript` downloads the retained local transcript privately. Keep exports within authorized staff access. An internal note does not remove a warning; complete the actual action separately and verify its receipt.

Avoid promising a response deadline you cannot meet. If the reviewer is unavailable, explain that the case is awaiting review and leave a clear handover.

<!-- chapter: Common situations -->
## 10 · Common situations

These are judgement examples. Use the actual rules, available evidence and your authority; do not treat them as automatic punishments.

### Honest first mistake
Give a brief, specific reminder and point to the right channel or rule. If it stops, avoid escalating merely to create a case. If the conduct warrants a formal warning, explain exactly what needs to change.

### Repeated spam after a reminder
Verify the account and relevant messages. Consider slowmode for a busy channel, a warning for a clear repeated breach, or a timeout if disruption is continuing. Preserve useful references before purging. Check whether another mod already acted.

### Two members arguing
Ask both to stop the public argument. Assess each person's conduct separately; "both were involved" does not mean both deserve the same sanction. Stop retaliation, avoid public cross-examination, and move reports to private support.

### Targeted hate, harassment or threats
Contain ongoing harm promptly, protect the targeted member's privacy and alert the admin team. Preserve only necessary evidence without reposting harmful content. Use the action justified by severity and policy; do not wait for a warning count if immediate protection is needed.

### Scam links, raids or a compromised account
Avoid opening suspicious files or signing into linked sites. Contain affected accounts/channels within your permissions, preserve message IDs and coordinate with an admin. A familiar account can be compromised. Do not grant extra permissions or ask for a token to "verify" it.

### Voice incident or missing context
Record who reported what and what staff actually witnessed. Do not present a second-hand claim as something you heard yourself. Use available Discord voice controls only within your authority; this handbook does not imply Taffy has separate voice-moderation commands.

### A friend or another staff member is involved
Ask an uninvolved moderator/admin to handle the review. Keep the same evidence standard and avoid public staff arguments.

### Reporting a Discord policy violation
Server moderation and a Discord report are separate actions. For a violating message, right-click it on desktop or hold it on mobile, choose Report Message, then follow the prompts. Alert the admin team for serious incidents; a server ban alone does not file a Discord report.

Official reporting instructions: https://discord.com/safety/360044103651-reporting-abusive-behavior-to-discord

<!-- chapter: Permissions and errors -->
## 11 · Permissions and troubleshooting

Both you and Taffy need the relevant permissions. A staff role name, access to this channel or a visible button does not grant every moderation power.

### Permission reference
- Warn, Warnings, Case history, `/case`, timeout, remove timeout and warning reset: Timeout Members (Moderate Members).
- Kick: Kick Members.
- Ban and Unban: Ban Members.
- Clear messages: Manage Messages, plus channel access and Read Message History.
- Slowmode: Manage Channels in the target channel.
- Lock/Unlock: Manage Channels and Manage Roles / permission-overwrite access in the target channel.

For member actions, your highest role and Taffy's highest role must be above the target's highest role. The actual server owner is exempt from the actor hierarchy comparison, but Taffy still needs its own higher role. Taffy blocks actions on yourself, bots and the owner. Discord also prevents timeouts on Administrators.

### Common problems
- "Selected member and pasted ID differ": clear one field or make both identify the same person.
- "Not a member": verify the ID and whether they left. Hall Ban/Unban and reset support the relevant nonmember workflows; other member actions generally need a current member.
- "Missing permission" / hierarchy error: ask an admin to check your permissions, Taffy's permissions and role positions. Do not move roles or grant yourself access to force an action.
- Expired/replaced review: open a fresh `/modhall`. If the old action may have run, check state and history first.
- DM not delivered, case saved: the action is recorded; do not repeat it.
- Discord action completed, case not saved: the action may already be in effect. Do not repeat it. Preserve the error, user/channel ID, time and known receipt, then ask the bot owner to repair the record.
- Slow response, timeout or unknown result: inspect current state, recent cases and relevant logs before any retry. Escalate if you cannot establish the result.
- No matching case: check the server, number and retention limits. Do not conclude the member invented it.

When asking for help, send the exact error, action, target ID, channel, time and any case number. Never send bot tokens or credentials.

<!-- chapter: Quick reference -->
## 12 · Quick reference and shift handover

### Member commands
`/modhall` — your private controls.
`/warn member:… reason:…` — record a warning.
`/warnings member:…` — up to 15 active warnings.
`/case number:…` — full retained case details.
`/timeout member:… duration:… reason:…`
`/untimeout member:… reason:…`
`/kick member:… confirm:true reason:…`
`/ban member:… confirm:true duration:… delete_window:… reason:…`
`/unban user_id:… reason:…`

`…` is a placeholder, not text to paste. Select the real member and enter real values. Ban duration and deletion window are optional; blank duration means permanent and blank deletion window keeps messages. All moderation reasons are optional in Taffy, but staff should provide a useful explanation.

### Channel commands — run in the affected channel
`/slowmode duration:… reason:…`
`/purge count:… confirm:true reason:…`
`/lock reason:…`
`/unlock reason:…`

### Warning corrections
Hall → Reset warnings clears every active warning. There is no individual-warning removal or case-comment editing command. Use a separately linked staff note for a disputed case; ask an admin before clearing valid warnings.

### Ticket commands — use in the relevant ticket
`/mail claim` · `/mail release`
`/mail reply text:…` — member-facing.
`/mail note text:…` — staff-only comment.
`/mail close reason:… confirm:true`
`/mail transcript` — retained local transcript.

### Before you leave
- Finish or hand off claimed tickets and pending reviews.
- Leave case numbers, evidence references and the next step in private staff records.
- Flag temporary channel restrictions and who will restore them.
- Check unresolved delivery errors or uncertain actions.
- Ask an uninvolved reviewer to handle appeals involving your own decision.

### First-session practice
Open your private Hall, inspect a retained case and identify the Cancel button without confirming an action. Read a ticket's relay instructions. Practise writing a factual reason and a separate private note. Do not issue a real warning, purge, timeout or ban merely to practise.

Handbook basis: `src/moderation.ts`, `src/moderation-duration.ts`, `src/moderation-hall.ts`, `src/moderation-hall-ui.ts`, `src/security.ts`, `src/store.ts`, `src/modmail.ts`. Recheck this guide whenever those controls change.
