0. Before You Configure
CoreCaseX is a Paper-only case management plugin. The current MVP expects Java 21, Paper 1.21.11 or newer, the CoreCaseX jar installed on a Paper server, and local SQLite storage bundled through the plugin jar.
The plugin does not currently ship a proxy module, MySQL or MariaDB backend, web dashboard, Discord bot commands, Discord ticket channels, or Discord threads. Discord support is webhook-only and optional.
Core terminology:
casemeans one structured support or report record.reportermeans the player who opened the case.staffmeans a player with staff permissions.Dialog UImeans the native Paper Dialog menus and forms opened by/case.replymeans player-visible conversation text.internal notemeans staff-only case text.evidencemeans structured context attached to a case.timelinemeans the audit history of case changes.
Trust model:
- server-controlled config strings can use MiniMessage.
- player-provided text is escaped before placeholder insertion.
- Discord webhook delivery is best-effort and must never block case workflows.
1. Folder Layout
Runtime folder:
plugins/CoreCaseX/
Bundled admin config files:
config.yml
case-types.yml
discord.yml
messages.yml
storage.yml
Runtime data created by the plugin:
data/corecasex.db
If a bundled admin config file is deleted from plugins/CoreCaseX/, CoreCaseX recreates the bundled default on the next server start with inline comments restored.
Do not commit runtime or build artifacts from a development checkout:
target/
plugin.zip
*.jar
*.zip
*.log
*.db
local Paper server folders
2. Reload vs Restart
Safe with /case reload:
config.ymlcase-types.ymldiscord.ymlmessages.ymlstorage.ymlvalues are reloaded into config memory
Requires restart or careful operational handling:
- changing the SQLite file path after storage has already opened
- changing server version or Paper runtime
- replacing the plugin jar
- regenerating deleted config files from defaults
/case reload reloads config and logs validation warnings. It does not migrate or move an already-open SQLite database connection to a new file path during the same runtime.
3. Runtime Guard
CoreCaseX requires Paper 1.21.11 or newer because the plugin uses modern Paper Dialog APIs.
Startup behavior:
- on a supported Paper runtime, the plugin continues normal startup.
- on an unsupported runtime, the plugin logs a clear error and disables itself gracefully.
This protects the server from missing Dialog API failures such as runtime method or class errors.
4. config.yml
Purpose:
- global language/config identity
- displayed case ID format
- per-player open case limit
- case submission cooldown
- staff notification switches
Current bundled default:
# Language tag reserved for future locale support. The current MVP reads visible text from messages.yml.
language: en
# Display format for case IDs in messages. Supported placeholder: {id}.
case-id-format: "#{id}"
# Maximum number of non-closed cases one player can have at the same time.
max-open-cases-per-player: 5
# Seconds a player must wait between creating new cases. Use 0 to disable.
submission-cooldown-seconds: 60
# In-game staff notification settings.
staff-notifications:
# Notify online staff with corecasex.staff.view when a new case is created.
new-case: true
# Notify staff when a reporter replies to a case.
player-replied: true
# Notify an online staff member when another staff member assigns them a case.
assigned-to-you: true
# Recipient policy for player replies. Accepted: assigned-only, assigned-and-staff, all-staff.
player-replied-scope: assigned-only
language
Reserved for future locale support. The current MVP reads active visible text from messages.yml.
case-id-format
Controls how case IDs are shown in configured messages. Supported placeholder: {id}. Example: CASE-{id}.
max-open-cases-per-player
Limits how many non-closed cases one reporter can have at the same time. Closed statuses are RESOLVED, REJECTED, and ARCHIVED. Values lower than 1 are clamped and warned about.
submission-cooldown-seconds
Controls the delay between new case submissions. Set to 0 to effectively disable the cooldown. Negative values are clamped and warned about.
staff-notifications
Controls in-game notifications for new cases, player replies, and assignment events. player-replied-scope accepts assigned-only, assigned-and-staff, and all-staff.
assigned-only: notify the assigned online staff member when possible; otherwise notify online case-view staff.assigned-and-staff: include the assigned staff member and staff viewers.all-staff: notify all online staff withcorecasex.staff.view.
5. case-types.yml
Purpose:
- enable or disable each built-in case type
- set default priority per case type
- control location collection defaults
- configure player report reasons
- configure bug report categories
Supported case type keys:
support-requestplayer-reportbug-reportlost-itemsgrief-theft
Supported priorities: LOW, NORMAL, HIGH, URGENT. Invalid priority values fall back to the built-in default for that case type and produce a validation warning.
Current bundled default:
# General support request flow for help that does not fit another case type.
support-request:
# If false, this case type is hidden from the Dialog creation menu.
enabled: true
# Priority assigned to new support requests. Accepted: LOW, NORMAL, HIGH, URGENT.
default-priority: LOW
# Default location collection behavior for this case type.
collect-location: true
# Structured report flow for reporting another player.
player-report:
enabled: true
default-priority: NORMAL
collect-location: true
# Reason options shown in the Paper Dialog option control.
reasons:
- Insults
- Spam
- Harassment
- Threats
- Scam
- Cheating
- Exploit abuse
- Other
# Structured flow for technical or gameplay bugs.
bug-report:
enabled: true
default-priority: NORMAL
collect-location: true
# Category options shown in the Paper Dialog option control.
categories:
- Command
- GUI / Menu
- Item
- Portal
- Reward
- Gameplay
- Other
# Flow for missing items, death-related issues, and recovery requests.
lost-items:
enabled: true
default-priority: NORMAL
collect-location: true
# Flow for griefing, theft, suspicious edits, and location-based incidents.
grief-theft:
enabled: true
default-priority: HIGH
collect-location: true
Support Request
General help when no other case type fits. Dialog fields: description and attach current location. Evidence can include reporter snapshot and current location when attached.
Player Report
Structured report against another player. Dialog fields: target player name, configured reason option, and description. Evidence can include reporter snapshot, current location, target snapshot when the target is online, and selected reason. If reasons is empty, CoreCaseX warns and falls back to Other.
Bug Report
Technical or gameplay issue flow. Dialog fields: configured category option and description. Evidence can include reporter snapshot, current location when collected, and selected category. If categories is empty, CoreCaseX warns and falls back to Other.
Lost Items / Death Issue
Missing items, death issues, or recovery requests. Dialog fields: description, claimed lost items, and attach latest death. Evidence can include reporter snapshot, claimed item text, last death location, last death cause, and last death time. Last-death evidence is tracked while the server is running.
Grief / Theft
Griefing, theft, suspicious edits, or location-based incidents. Dialog fields: description, manual location text, and attach current location behavior. Evidence can include reporter snapshot, current location, and manual location text.
6. discord.yml
Purpose:
- enable or disable Discord webhook output
- configure default, type-specific, and priority-specific webhooks
- control which case events send Discord embeds
- configure embed colors
Current bundled default:
# Master switch for Discord webhook notifications.
enabled: false
# Legacy fallback webhook URL. Prefer webhooks.default for new configs.
webhook-url: ""
# Discord webhook routing. Priority routes win over type routes; type routes win over default.
webhooks:
default: ""
types:
support-request: ""
player-report: ""
bug-report: ""
lost-items: ""
grief-theft: ""
priorities:
low: ""
normal: ""
high: ""
urgent: ""
# Server name included in webhook username text.
server-name: "Minecraft Server"
# Per-event Discord notification switches.
events:
case-created: true
urgent-created: true
case-claimed: true
case-assigned: true
status-changed: true
priority-changed: true
player-replied: true
info-requested: true
staff-replied: true
case-resolved: true
case-rejected: true
# Decimal RGB embed colors for each Discord event family.
embed-colors:
created: 5814783
urgent: 15548997
claimed: 16753920
assigned: 16753920
status: 5793266
priority: 16753920
reply: 3447003
info: 5793266
staff-reply: 5793266
resolved: 5763719
rejected: 15548997
Enabling Discord
enabled: true
webhooks:
default: "https://discord.com/api/webhooks/..."
webhooks.default wins over legacy webhook-url when both are set.
Webhook Routing
Routing priority is:
- priority webhook
- case type webhook
- default webhook
- legacy
webhook-url
Use priority routes for urgent escalation and type routes when reports, bugs, or grief cases should go to different Discord channels.
Webhook Safety
- blank webhook URLs are disabled
- malformed URLs are skipped
- non-HTTP(S) URLs are skipped
- request creation failures are logged
- send failures are logged
- non-2xx HTTP responses are logged
- case workflows continue even if Discord fails
- embeds disable allowed mentions with
{"allowed_mentions":{"parse":[]}}
7. storage.yml
Purpose: configure the SQLite database path. SQLite is the active storage backend for the current MVP.
Current bundled default:
# SQLite storage settings. SQLite is the active storage backend for the MVP.
sqlite:
# Database path relative to plugins/CoreCaseX/. Changing this after startup requires a restart.
path: "data/corecasex.db"
The path is resolved relative to the plugin data folder. Default full runtime path:
plugins/CoreCaseX/data/corecasex.db
Stored data includes cases, timeline events, replies, internal notes, resolutions, evidence, and schema migration markers. CoreCaseX creates tables and indexes automatically, and existing SQLite files are migrated idempotently.
Changing this path after startup requires restart to open the new file cleanly. Unsafe or blank paths fall back to data/corecasex.db and produce a validation warning.
8. messages.yml
Purpose:
- command feedback
- validation text
- player notifications
- staff notifications
- Dialog titles
- Dialog body lines
- Dialog input labels and defaults
- detail lines
- button labels and hover text
The bundled messages.yml is heavily commented. It controls almost every visible line in the current command and Dialog experience.
Top-Level Message Keys
prefix
only-players
no-permission
case-created
case-claimed
case-not-found
case-updated
case-closed
case-archived
invalid-case-id
invalid-priority
invalid-status
assignee-online-required
reload-complete
usage-case-root
usage-case-view
usage-case-open
usage-case-claim
usage-case-assign
usage-case-priority
usage-case-status
usage-case-archive
staff-new-case
staff-player-replied
staff-assigned-to-you
player-reply-added
staff-reply-received
info-requested
resolved-notice
rejected-notice
dialogs
Common Placeholders
{id}and{case_id}: case ID{staff}: staff player name{reporter}: reporter player name{type},{status}, and{priority}: case metadata{assigned}: assigned staff name or fallback text{updated},{created}, and{closed}: formatted times{location},{description},{reply_count},{note_count}, and{evidence_count}: detail data{resolution_outcome}and{resolution_message}: closure data
MiniMessage is supported in server-controlled messages. Player-provided placeholder values are escaped before rendering.
Command Usage Messages
usage-case-root: "<yellow>Usage: /case [list|view|board|open|claim|assign|priority|status|archive|reload|debug]</yellow>"
usage-case-view: "<yellow>Usage: /case view <id></yellow>"
usage-case-open: "<yellow>Usage: /case open <id></yellow>"
usage-case-claim: "<yellow>Usage: /case claim <id></yellow>"
usage-case-assign: "<yellow>Usage: /case assign <id> <online-staff></yellow>"
usage-case-priority: "<yellow>Usage: /case priority <id> <LOW|NORMAL|HIGH|URGENT> [reason]</yellow>"
usage-case-status: "<yellow>Usage: /case status <id> <OPEN|CLAIMED|WAITING_PLAYER|WAITING_STAFF> [reason]</yellow>"
usage-case-archive: "<yellow>Usage: /case archive <id></yellow>"
Staff and Player Notification Messages
staff-new-case: "<gold>New Case #{id}</gold> <gray>-</gray> <white>{type}</white> by <white>{reporter}</white>"
staff-player-replied: "<gold>Case #{id}</gold> <gray>-</gray> <yellow>{reporter}</yellow> replied."
staff-assigned-to-you: "<gold>Case #{id}</gold> <gray>-</gray> assigned to you."
player-reply-added: "<green>Your reply was added to Case #{id}.</green>"
staff-reply-received: "<yellow>Staff replied to Case #{id}.</yellow>"
info-requested: "<yellow>Staff requested more information for Case #{id}.</yellow>"
resolved-notice: "<green>Your Case #{id} has been resolved.</green>"
rejected-notice: "<red>Your Case #{id} has been rejected.</red>"
Dialog Text Structure
dialogs:
titles: {}
body: {}
inputs: {}
detail-lines: {}
validation: {}
buttons: {}
dialogs.titles controls window titles such as main menu, case type menu, case forms, player cases, staff board, staff details, action dialogs, reply forms, resolve/reject dialogs, and case info sections.
dialogs.body controls short helper lines for the main menu, case type menu, staff tools, case forms, empty lists, and board filters.
dialogs.inputs controls labels and defaults for description, attach-location, attach-death, boolean yes/no, target player, reason, category, manual location, claimed lost items, priority, status, outcome, close reason, final message, reply, staff player name, question, and note inputs.
dialogs.detail-lines controls submit confirmation rows, player summaries, staff summaries, action summaries, overview rows, description rows, evidence rows, conversation rows, internal note rows, and resolution rows.
dialogs.validation controls required-field errors, invalid priority/status text, missing location/world text, expired Dialog action text, wrong-player action text, and online-assignee errors.
dialogs.buttons controls every clickable row label and hover text, including main actions, case type rows, staff tools, review/submit buttons, back buttons, board filters, case list rows, section openers, player replies, staff replies, claim, assign/reassign, priority, status, teleport, resolve, reject, and archive.
Complete Dialog Key Map
This map mirrors the current bundled messages.yml key structure without duplicating every value on the page.
dialogs.titles:
corecasex
open-a-case
staff-tools
support-request
report-a-player
bug-report
lost-items-death-issue
grief-theft
confirm-case-submission
your-cases
case-detail
staff-case-board
staff-board-filter
staff-case-detail
staff-case-actions
assign-case
change-priority
change-status
reply-to-case-case
reply-to-player
request-info
internal-note
resolve-case
reject-case
case-info-section
dialogs.body:
main
case-type-menu
staff-tools
support-request
player-report-reasons
bug-report-categories
lost-items-death-summary
grief-theft
your-cases-empty
your-cases-select
staff-board-filter-select
staff-board-empty
staff-board-select-case
dialogs.inputs:
description
attach-location
attach-death
bool-yes
bool-no
target-player
reason
category
manual-location
claimed-lost-items
priority
status
outcome
close-reason
final-message
reply
staff-player-name
question
note
dialogs.detail-lines:
confirm-type
confirm-target
confirm-reason
confirm-category
confirm-description
confirm-location
confirm-items
confirm-last-death
confirm-manual-location
player-summary-status
player-summary-type
player-summary-updated
player-summary-description
player-summary-help
staff-summary-status
staff-summary-reporter
staff-summary-assigned
staff-summary-updated
staff-summary-counts
action-status
action-priority
action-assigned
overview-type
overview-status
overview-priority
overview-reporter
overview-assigned
overview-created
overview-updated
overview-location
description-text
description-location
evidence-empty
evidence-category
evidence-entry
conversation-empty
conversation-header
conversation-reply-meta
conversation-message
conversation-note-count
conversation-note-meta
conversation-note-message
resolution-empty
resolution-outcome
resolution-message
resolution-closed
dialogs.validation:
open-by-id-help
description-required
target-required
reason-required
category-required
items-required
invalid-priority
closed-status-command
invalid-status
no-location
world-not-loaded
text-required
expired-action
wrong-player-action
assignee-online-required
dialogs.buttons:
open-a-case
your-cases
staff-tools
report-a-player
report-a-bug
lost-items
grief-theft
support-request
case-board
open-by-id
review
submit-case
submit
change
add-reply
back
go-back
case-types
open-support-request
player-case-list-item
staff-board-filter
staff-board-case-item
overview
description
evidence
conversation
resolution
actions
player-reply
staff-reply
request-info
internal-note
claim
assign
priority
status
teleport
resolve
reject
archive
Button Entry Shape
dialogs:
buttons:
example:
label: "<yellow>Example</yellow>"
hover: "<gray>Hover text.</gray>"
Hover text may include \n line breaks.
9. Workflow Rules
Statuses
Supported statuses are OPEN, CLAIMED, WAITING_PLAYER, WAITING_STAFF, RESOLVED, REJECTED, and ARCHIVED. Direct /case status accepts only non-closed workflow statuses: OPEN, CLAIMED, WAITING_PLAYER, and WAITING_STAFF.
Priorities
Supported priorities are LOW, NORMAL, HIGH, and URGENT. Priority affects staff board ordering, high/urgent board filters, Discord priority routing, and the urgent-created Discord notification.
Board Filters
Staff board filters include all open cases, unassigned, assigned to me, high and urgent, waiting player, waiting staff, recent closed, and archive.
Archive Rules
Archive is allowed only when a case is RESOLVED or REJECTED. Archive is rejected for OPEN, CLAIMED, WAITING_PLAYER, and WAITING_STAFF.
Claim and Assignment Rules
Claim assigns the case to the clicking staff member, fails if the case is already assigned, fails if the case is closed, and uses a conflict-safe database update.
/case assign is the MVP assign/reassign command. It requires the target staff member to be online, sets or replaces the assignee, records previous and new assignee names in the timeline, moves OPEN cases to CLAIMED, and rejects RESOLVED, REJECTED, or ARCHIVED cases.
10. Evidence Visibility
Evidence levels are PLAYER_VISIBLE, STAFF_ONLY, and SENSITIVE.
- players can see
PLAYER_VISIBLEevidence. - staff with
corecasex.staff.view-evidencecan seeSTAFF_ONLYevidence. - staff with
corecasex.staff.view-sensitive-evidencecan seeSENSITIVEevidence.
Evidence can include reporter snapshot data, reporter location, online target player snapshot data, report reason, bug category, claimed lost items, last death context, and manual location text.
11. Dialog UI Configuration
Normal player entrypoint:
/case
Dialog menus include:
- main menu
- case type menu
- guided case creation forms
- review-before-submit screens
- player case list
- player case detail view
- staff tools menu
- staff board filters
- staff case detail view
- staff action menu
- staff Open by ID input
Dialog input types include free text for descriptions, notes, replies, outcomes, final messages, target players, and manual locations; option controls for reasons, categories, priority, and status; and boolean controls for attach-location and attach-death choices.
Safe Dialog Actions
Clickable rows use short internal commands:
/case ui <token>
- tokens are owner-bound
- tokens are permission-checked at click time
- successful callbacks are one-use
- expired tokens are rejected
- wrong-player token use is rejected
12. Commands
Player Commands
/case
/case list
/case view <id>
Staff Commands
/case board
/case open <id>
/case claim <id>
/case assign <id> <staff>
/case priority <id> <LOW|NORMAL|HIGH|URGENT> [reason]
/case status <id> <OPEN|CLAIMED|WAITING_PLAYER|WAITING_STAFF> [reason]
/case archive <id>
Admin Commands
/case reload
/case debug
Internal Dialog Command
/case ui <token>
The internal command is generated by clickable Dialog rows. Players should not need to type it manually.
13. plugin.yml
Complete bundled plugin descriptor. Maven resolves ${project.version} when the release jar is built.
name: CoreCaseX
version: ${project.version}
main: com.corecasex.CoreCaseXPlugin
api-version: '1.21'
description: Structured case management for Paper servers.
author: CoreCaseX
commands:
case:
description: Open and manage CoreCaseX cases.
usage: /case [list|view|board|open|claim|assign|priority|status|archive|reload|debug]
permissions:
corecasex.use:
default: true
corecasex.case.create:
default: true
corecasex.case.list:
default: true
corecasex.case.view-own:
default: true
corecasex.staff.board:
default: op
corecasex.staff.view:
default: op
corecasex.staff.claim:
default: op
corecasex.staff.assign:
default: op
corecasex.staff.note:
default: op
corecasex.staff.reply:
default: op
corecasex.staff.request-info:
default: op
corecasex.staff.priority:
default: op
corecasex.staff.status:
default: op
corecasex.staff.resolve:
default: op
corecasex.staff.reject:
default: op
corecasex.staff.archive:
default: op
corecasex.staff.teleport:
default: op
corecasex.staff.view-evidence:
default: op
corecasex.staff.view-sensitive-evidence:
default: op
corecasex.admin.reload:
default: op
corecasex.admin.debug:
default: op
14. Permissions
Player Permissions
corecasex.use
corecasex.case.create
corecasex.case.list
corecasex.case.view-own
Staff Permissions
corecasex.staff.board
corecasex.staff.view
corecasex.staff.claim
corecasex.staff.assign
corecasex.staff.note
corecasex.staff.reply
corecasex.staff.request-info
corecasex.staff.priority
corecasex.staff.status
corecasex.staff.resolve
corecasex.staff.reject
corecasex.staff.archive
corecasex.staff.teleport
corecasex.staff.view-evidence
corecasex.staff.view-sensitive-evidence
Admin Permissions
corecasex.admin.reload
corecasex.admin.debug
Player permissions default to true. Staff and admin permissions default to op. A practical LuckPerms setup gives normal players use/create/list/view-own, helpers board/view/reply/request-info, moderators claim/note/priority/status/resolve/reject/teleport as appropriate, and senior staff archive plus sensitive evidence access only when needed.
15. Config Validation
CoreCaseX logs warnings on startup and /case reload for:
- invalid Discord webhook URLs
- invalid case type default priorities
- empty
player-report.reasons - empty
bug-report.categories - invalid
staff-notifications.player-replied-scope max-open-cases-per-player < 1submission-cooldown-seconds < 0- unsafe or blank
storage.yml -> sqlite.path
These warnings do not normally disable the plugin. They identify settings that were ignored, defaulted, or degraded. Numeric values are clamped safely, and unsafe SQLite paths fall back to data/corecasex.db. Hard-fail behavior is reserved for unsafe runtime conditions such as unsupported Paper version.
16. Regenerating Defaults
- Stop the server.
- Back up
plugins/CoreCaseX/. - Delete the config file you want to regenerate.
- Start the server.
- Reapply only the settings you still need.
Common files to regenerate:
config.yml
case-types.yml
discord.yml
messages.yml
storage.yml
Do not delete data/corecasex.db unless you intentionally want to remove all cases and history.
17. Troubleshooting Quick Reference
Plugin disables itself on startup
Check the server version. CoreCaseX requires Paper 1.21.11+.
/case does not open
- check
corecasex.use - confirm the server is Paper, not Spigot
- confirm the plugin enabled successfully
- confirm the server version supports Paper Dialog APIs
A player cannot create cases
- check
corecasex.case.create - check that the case type is enabled in
case-types.yml - check
max-open-cases-per-player - check
submission-cooldown-seconds
A staff member cannot see staff tools
- check
corecasex.staff.board - check
corecasex.staff.view - confirm the staff member is online as a player
Assignment fails
Assignment and reassignment require the assignee to be online and fail for resolved, rejected, or archived cases. Use the exact online player name.
Claim fails
Claim fails when the case is already assigned or when the case is resolved, rejected, or archived.
Archive fails
Archive only works after a case is resolved or rejected.
Discord does not send
- check
discord.yml -> enabled: true - check for a valid
https://webhook URL - check the event key under
events - check route order: priority, then type, then default
- check server console warnings for invalid URL, send failure, or non-2xx response
Discord pings roles or users
CoreCaseX disables allowed mentions in webhook payloads. If Discord still pings, check external automations or manually edited webhook content outside CoreCaseX.
Evidence is missing in staff view
- check
corecasex.staff.view-evidencefor staff-only evidence - check
corecasex.staff.view-sensitive-evidencefor sensitive evidence - confirm the evidence was actually collected for that case type
Config changes do not appear
Run /case reload. If the change is the SQLite path or plugin jar, restart the server instead.
18. Production Validation Checklist
- boot on Paper 1.21.11+
- confirm CoreCaseX enables without runtime guard errors
- run
/case - create one support request
- create one player report
- create one bug report
- create one lost items case
- create one grief/theft case
- inspect player case list and details
- inspect staff board filters
- test staff Open by ID Dialog input
- claim a case
- assign and reassign a case to an online staff member
- change priority
- change status
- add an internal note
- send a staff reply
- request more info
- reply as the reporter
- resolve a case
- reject a case
- archive a resolved or rejected case
- test teleport on a case with location evidence
- test Discord with a valid webhook
- test Discord with a malformed webhook and confirm case workflows still succeed
- run
/case reloadafter a harmless wording change
For source builds, useful checks are:
.\mvnw.cmd clean test
.\mvnw.cmd clean package
git diff --check
19. Quick Setup Examples
Small Survival Server
- keep all five case types enabled.
- keep grief/theft default priority as
HIGH. - enable a Discord default webhook for staff visibility if Discord mirroring is wanted.
- keep
player-replied-scope: assigned-only. - grant sensitive evidence only to senior staff.
Minigame Server
- keep bug reports and support requests enabled.
- optionally disable grief/theft when it does not apply.
- route urgent priority cases to a separate Discord webhook.
- use bug categories that match your game modes.
Strict Staff Workflow
- give helpers view, reply, and request-info permissions only.
- give moderators claim, status, and priority permissions.
- give senior staff resolve, reject, archive, and sensitive evidence permissions where appropriate.
- keep archive restricted to resolved or rejected cases.
- use internal notes for staff handoff.
20. Summary
CoreCaseX configuration controls player case creation, five built-in case types, case priorities, reason and category options, location and death evidence behavior, staff board workflow notifications, Discord webhook routing and events, SQLite file location, command and Dialog text, validation messages, and permissions through plugin.yml.
The intended operating model is straightforward: players use /case, staff use the Dialog board and actions, SQLite stores the full history, Discord mirrors important events when configured, and validation warnings guide admins without breaking normal case workflows.