> ## Documentation Index
> Fetch the complete documentation index at: https://docs.pup.run/llms.txt
> Use this file to discover all available pages before exploring further.

# Tickets

> Set up private support requests, submit an intake and manage conversations.

Ticket panels give members a button or select-menu entry point for support, moderation, appeals, or another approved request type. Configure them from **Support → Ticket panels** in the server dashboard.

Pup retains the exact Discord publication receipt for every panel revision. The worker regularly
checks the current message and keeps superseded messages disabled after a move. A missing or
modified current message is marked **faulted**, rather than silently accepting requests from an
unknown entry point; staff can then use **Repair** or move the panel. If Discord accepted a new
message but the save was interrupted, the dashboard requires that receipt's exact message ID
before reconciling it, so a retry cannot create a duplicate entry panel.

## Before publishing

Every panel requires a panel publication destination, a private ticket category, staff role, member-facing description, intake prompt, and routing key. The publication destination is where the entry panel appears; the category is where private ticket channels are created. You can also require an eligible role, limit each member's open tickets from that panel, and set an availability window.

Preview the saved draft in the dashboard, then choose the Discord message channel where the entry point belongs. Publishing creates a new Pup-owned message. Moving a panel publishes the current revision in the new channel and disables the old control.

Each publication has a durable receipt before Pup calls Discord. If Discord accepts a message but Pup cannot save its ID, the panel stays in a reconciliation state instead of being published again. An administrator can verify the message’s receipt token and enter its Discord message ID to finish that one publication. Failed attempts retain their error and can be retried safely; the receipt prevents a retry from silently orphaning an uncertain message.

## Safe changes

Editing creates a new panel revision. Disable pauses new entries, repair restores a disabled or faulted control, and retire permanently closes that entry point. Replace retires one panel in favor of another published panel.

An accepted entry keeps a snapshot of the exact panel revision, request type, destination, staff team, routing key, and prompt it used. Later edits, moves, replacement, or retirement therefore do not detach existing tickets from their original configuration.

Each panel also sets a lowercase private-channel prefix and a bounded number of open containers. The prefix and capacity policy are snapshotted when a request is accepted, so later edits do not rename or change the retention rules for an existing ticket.

## Typed support recipes

Each panel may configure an acknowledgement, requester follow-up, escalation, inactivity action, and closure message. These are five named recipe stages, not a programmable workflow engine. The policy revision is copied to the private intake and then to its ticket together with the exact request type, validated answers, routed priority, staff role, availability decision, and deadline. Later panel edits cannot change an in-flight request.

The recipe preview exposes the named stages before delivery. An escalation that requires an unavailable configured staff role is shown as skipped rather than silently rerouted. Reconciliation has explicit outcomes for stale leases, duplicate delivery, partial delivery, cancellation, and failure; it never opens a second ticket or changes a completed ticket's route. Provider and security ceilings remain fixed.

## Private ticket creation

When a member submits a published panel, Pup records the request before asking Discord
to create its private channel. Pup grants access to the requester and the
configured staff role; the server owner and Discord administrators can also see it.
If Discord cannot create it, the saved request is marked for a
safe staff retry; members do not need to submit the form again.

Pup reconciles each managed private channel's permission overrides for the submitter,
configured staff role and Pup itself, while denying the everyone role. Discord's
owner and administrator access still applies. A stale managed overwrite is
repaired on the next safe ticket-open attempt; provider failures keep the ticket faulted
and retryable instead of widening access.

Approved staff participants are stored with the ticket and deduplicated before their
private overwrite is applied. Participant changes use the ticket revision so stale
add/remove requests are rejected rather than silently changing access.

Authorized staff changes immediately reconcile the managed channel. If Discord is unavailable
or the channel is missing, Pup returns a repair-needed outcome and retains the audited desired
participant state rather than granting access elsewhere.

Each ticket keeps a separate event history for its opening, container creation,
assignment, status changes, and recovery. Closing, archiving, reopening, and deletion
are explicit retention-aware states rather than channel deletion side effects.

## Ticket lifecycle

The panel's workflow preset is snapshotted onto the ticket: **standard** opens a ready
ticket, while **staff review** opens it paused for an explicit staff claim or assignment.
Authorized staff use explicit actions to claim, assign or transfer ownership, set priority
or deadline, pause with a reason, reopen, close, archive, delete, or restore a retained
record. Each action supplies the ticket revision shown by the staff panel; a stale panel,
duplicate retry, or concurrent staff action is rejected and must be refreshed.

Pup retains the requester, approved participants, owner, status reasons, deadline, and
append-only event history separately from the Discord container. A missing managed channel
is recorded as an orphaned, retryable container fault, rather than erasing the request.
Restoring a soft-deleted record returns it to archived retention state; reopening it is a
separate, deliberate action. This makes restoration and retention decisions reviewable.

## Staff collaboration

Ticket conversations, internal notes and collaboration are available to the configured
staff team and the verified server owner. The owner does not need the configured
staff role. Configuration permission or installation-operator status alone does not
grant this dashboard access. Staff may add approved team
members as participants or watchers, claim and transfer ownership, and set priority or a
deadline. Before a participant, owner, or mention is accepted, Pup checks that the member still
has the ticket's snapshotted staff role; a ticket cannot be used to grant a different member
private-channel access.

Internal notes, handoffs, escalations, and staff mentions are stored only in Pup's private ticket
record and are never relayed into Discord. The ticket workflow preset controls the collaboration
rules stored with the ticket: **standard** allows any authorized staff member to reassign work;
**staff review** requires the current owner to transfer work and requires a handoff explanation.
Every collaboration and ownership mutation uses the observed ticket revision. Pup rejects stale
or conflicting actions, retains the private note immutably, and records an append-only event
without duplicating private note content into the broader lifecycle history.

You can optionally set an inactivity period before an open ticket is archived, and a period after archival before its support record is soft-deleted. Both values are bounded between one hour and thirty days, are off by default, and are stored with the ticket. Archiving keeps the private Discord channel and its history, while preventing the requester from sending further messages. Deletion is deliberately database-only: Pup never deletes a Discord channel from this policy.

## Bounded transcripts

When a ticket has an archive-deletion period, authorized members of that ticket's configured staff team or the verified server owner can generate a bounded transcript for export. Each panel chooses how many recent messages to include, from 1 to 100; 100 remains the universal safety ceiling. The configured depth is snapshotted when the member opens their intake and again when Pup creates the support ticket, so later panel edits do not change that ticket's transcript. Messages are stored in chronological order, without attachment URLs or attachment copies. The transcript is accessible to the configured staff team and server owner, and inherits that ticket's snapshotted retention period; tickets with no configured deletion period do not produce a retained transcript. Search is performed only after an authorized read of the encrypted export. Authorized staff and the server owner can read, search, export, or delete the transcript through the private ticket surface; deletion removes the encrypted object and soft-deletes its ticket association without deleting the Discord channel. At expiry, the worker schedules provider deletion and marks the association deleted only after the encrypted object removal is verified.

## Submit a ticket

Panels can ask for up to five answers: short or long text, a configured choice,
a member or channel reference, or a date. Required answers must be completed.

1. Open the panel in Discord and complete its form. Pup shows a private preview
   before sharing the request with staff.
2. If attachments are allowed, use `/ticket-attachment` with the draft reference
   from the preview and a file. Repeat for additional files within the panel's
   limit. Discord modals cannot collect files directly. Pup checks each file
   against the panel's count, size and approved image, PDF or text types.
3. Review the answers, attached files and disclosure, then confirm the request.
   After confirmation, the configured staff team and server owner can access the
   intake. The preview expires after the panel's configured interval of one to
   sixty minutes; an expired preview must be started again.

Pup stores the displayed field labels, answers and consent details with the
confirmed request, so later panel edits do not rewrite it. Do not put sensitive
intake questions in the panel's public description.

If a Discord message or referenced resource is removed outside Pup, disable the
panel until you have corrected its configuration, then publish or repair it.

Panels always have a safe default destination and staff role. An administrator can add declarative routing rules for a request type, selected answer, eligible role, priority and currently available staff. A rule that does not match, or needs unavailable staff, never drops a request: the panel's default destination is used instead.

## Support inbox

Staff with **Manage support conversations** can open **Support → Inbox** to find tickets in their configured teams. The verified server owner can access all of the server's support conversations. Read current messages, leave internal notes, assign staff, change priority and manage the conversation. Dashboard replies carry staff attribution and report delivery separately from queueing. A page refresh does not resend a reply.

Closing a channel ticket keeps requester read access while stopping posting. Reopening restores Pup's own posting changes and preserves intervening manual changes. Thread tickets cannot provide requester-only read-only permissions, so this close/reopen operation is unavailable for threads.

Live viewing does not retain a transcript. Retained channel transcripts use the ticket's configured recent-message limit and retention period. Deleting a retained transcript requires confirmation and does not delete Discord messages.

## Dashboard configuration and attention

Panel configuration groups the entry point, destination and team, capacity and cleanup, attachments, workflow and questions, and privacy confirmation. Optional routing and availability stays collapsed until needed. Closing a section keeps its draft; discard restores every field, including additional questions.

Panels with failed or uncertain publication appear first. Complete the repair or link the existing Discord panel after checking its destination; simply viewing the panel cannot confirm delivery. Changes affect new tickets. Existing tickets keep the questions, destination and staff team they opened with.
