Skip to content

Identifiers

The platform's identifier conventions. Identity keys are never used as display text; display names are snapshots.

IdentifierFormatOwner / sourcePurpose
discord_idDiscord snowflake (numeric string)Discord OAuth / botCanonical identity for agents, punishment issuers/targets, actors (events.actor_id), profile snapshots
report_idFree text, ≤64 chars [A-Za-z0-9_\-:.#] (e.g. DPS-CASE-01234, UUIDs)Bot at creationReports primary key
punishment_idAA0AA0 (2 letters, 1 digit, 2 letters, 1 digit)Generated transactionally in rpc_punishment_create (collision-retried)Punishments primary key; client never supplies it
agent_idBot-generated (DPS-AG-##### family via /generate/agent)Bot after trainingDPS-internal agent identifier; secondary lookup key (audit by_name resolution, db_resolve_agent_name)
security_idBot-generatedBot (Phase 2+)Onboarding record
agreement_idAGM-##### (/generate/agreement)BotOnboarding record
clearance_idCL-### (/generate/clearance)BotOnboarding record
join codeSC-###X# (/generate/join)BotOnboarding
investigation idINV-##### (/generate/investigation)BotGenerated codes (stored on Discord side)
session_idUUID (gen_random_uuid())DatabaseTraining sessions + Realtime channel topics (training:session:<uuid>)
scenario_idbigint identityDatabaseTraining scenarios / session scenario instances
action_id / queue idbigint identityDatabasepending_actions, discipline_queue rows
correlation_idsecrets.token_hex(8) per admin requestAPI (_admin_identity)Ties UI request → audit row → canonical event
client_idClient-generated per training actionTrainee frontendIdempotency key ((session_id, client_id) unique index)
roblox_idPositive integerER:LCPlayer lookups (/erlc/player/<id>)

Display-name resolution

  • assigned_agent on reports may be Name (userid), a bare name, an agent_id, or a Discord ID; matching against the session agent is exact only (never prefix/substring).
  • Serializers scrub known identifiers out of display text (_scrub_user_ids); resolved names are computed server-side and cached per request.
  • by_name in the audit log resolves timeline.by against agents.discord_id, agents.agent_id, or agents.name (first match).