Browse documentation

VIRCON

Appeals & Expiration

FAIRNESS & ACCOUNTABILITY

Appeals & Expiration System

VIRCON provides a structured appeals workflow for users to contest moderation decisions, plus an automatic expiration system to ensure temporary punishments don't become permanent. Together, these systems maintain fairness and prevent over-punishment.

Appeal Commands

Commands for submitting and managing user appeals.

  • ,appeal submit <punishment_id> <reason>
  • ,appeal view <appeal_id>
  • ,appeal list [status]
  • ,appeal review <appeal_id> <approve|deny> <notes>

Expiration Commands

Commands for managing automatic punishment expiration.

  • ,expire set <punishment_id> <duration>
  • ,expire check <punishment_id>
  • ,expire list [upcoming|expired]
  • ,expire mark <punishment_id> <expired>

Appeal Statuses

Possible states in the appeal review process.

pending
under_review
approved
denied

Expiration Types

Default expiration periods for different punishment types.

Punishment TypeDefault ExpiryAuto-Remove
Warning30 daysNo
Temporary BanSet durationYes
KickNo expiryNo
Strike90 daysNo

Appeal Workflow

Step-by-step process for submitting and reviewing appeals.

  1. 1. User submits appeal via ,appeal submit with punishment ID and reason.
  2. 2. Appeal enters 'pending' status and notifies staff in appeal review channel.
  3. 3. Staff member reviews the appeal with ,appeal review.
  4. 4. Reviewer can approve (lifting punishment) or deny (keeping it in place).
  5. 5. User receives automated DM with decision and reviewer notes.
  6. 6. Appeal is logged to audit trail with full decision context.

Expiration Workflow

Automated process for expiring temporary punishments.

  1. 1. Staff sets expiration with ,expire set when issuing punishment.
  2. 2. System tracks expiry timestamp in punishment_expirations table.
  3. 3. Daily cron job checks for expired punishments at 00:00 UTC.
  4. 4. Expired warnings and strikes are marked as inactive (not deleted).
  5. 5. Expired temporary bans trigger automatic unban via VRChat API.
  6. 6. Expiration event logged to mod-log channel with automated context.

Appeal Database Schema

Database fields for tracking appeal submissions and reviews.

FieldDescription
appeal_idAuto-incremented unique identifier.
punishment_idReference to original moderation action.
submitter_discord_idUser who submitted the appeal.
submitter_vrc_idVRChat account of the appellant.
reasonUser-provided justification for appeal.
statuspending, under_review, approved, denied.
reviewer_discord_idStaff member who reviewed the appeal.
decisionapprove or deny.
reviewer_notesStaff explanation for decision.
submitted_atTimestamp of appeal submission.
reviewed_atTimestamp of staff decision.

Expiration Database Schema

Database fields for tracking punishment expiration timers.

FieldDescription
expiration_idUnique expiration record ID.
punishment_idLink to moderation log entry.
punishment_typeban, warn, strike, kick.
expires_atISO timestamp for automatic expiration.
expiredBoolean: has expiration occurred.
auto_removedBoolean: was action auto-lifted.
removed_atTimestamp when removal occurred.

System Integration

How appeals and expiration systems integrate with other features.

  • Appeals integrate with incident reports - linked via punishment_id.
  • Expired punishments still appear in search and modhistory (marked as expired).
  • Appeal approvals can auto-close linked incidents if configured.
  • Expiration events are logged to audit trail for accountability.
  • Staff can manually override expiration timers before they trigger.

Best Practices

Guidelines for effective appeal and expiration management.

  • Set realistic expiration timers - 30 days for warnings, 90 for strikes.
  • Require staff notes when denying appeals for transparency.
  • Review pending appeals within 48 hours to maintain user trust.
  • Use expiration list to audit upcoming auto-removals weekly.
  • Link expiration to severity - minor infractions expire faster.