The language of cavbot2, the 7th Cavalry Gaming Regiment's Discord bot and web panel. Define a new term here rather than in a code comment.
7Cav: The 7th Cavalry Gaming Regiment, the gaming community this bot serves. Its wiki at https://wiki.7cav.us/ is the member-facing reference for the regiment's structure and terms.
Cav member: A Discord member who holds a rank role and whose milpac shows no discharge. A retiree is one. Member-facing copy says "Cav member". Avoid: rank holder (in copy), trooper (in copy), verified member, Cav.
Rank ladder: The regiment's 29 ranks in seniority order, most senior first. The handover rule ranks occupants by the rank role each one holds. Avoid: rank list, rank table, seniority list, role ladder.
Rank role: The Discord role that counts as one rank on the rank ladder, set by a panel admin. A rank has one or none, and a role counts for one rank at most. A discharged trooper keeps theirs. Avoid: Cav role, member role, rank (for the role).
Discharged role: The Discord role the forum gives a trooper while their milpac's position is Discharged, set by a panel admin. A dishonorable discharge brings none. Avoid: discharge role, past member role.
Department: One of the twelve parts of the regiment /afsm checks: S1 (Personnel), S2 (Intelligence), S3 (Operations), S5 (Public Affairs), S6 (Information Systems), S7 (Training), WAG (Wiki Admin Group), RTC (Recruit Training Command), RRD (Regimental Recruiting Department), MP (Military Police), ODS (Officer Development School) and NCOA (Non-Commissioned Officer Academy).
Position: A trooper's assignment as their milpac records it, in free text such as 2/B/1-7, Reservist or a department code like S1.
Position group: A unit as the milpacs name it, grouping its positions, such as ACD at battalion level or D/ACD, a company within it.
Zulu: UTC, the regiment's standard time, written with a z suffix as in 2300z. Wherever the bot decides which day something falls on, as in counting accountable days, a day is a UTC calendar date. Avoid: GMT.
Milpac: One trooper's record in MILPACS, the regiment's personnel record system.
Forum username: A member's handle on the forum, also stored on their milpac. The bot finds a member's milpac by it.
Connected Discord account: The Discord account a forum user has connected to their forum account on the forum's connected accounts page. The Discord ID a milpac names is this account's, so a milpac whose forum user connected none names no Discord account. Avoid: linked Discord, Discord link, discordId.
Roster: The troopers the milpacs list under a department or position group, such as everyone in S1 or in D/ACD.
Discharge: A trooper's state while their milpac's position is Discharged or Dishonorably Discharged. A retirement is not one, and a re-enlistment ends one. Avoid: past member, separation. Retirees are past members too.
Forum: The regiment's Xenforo web forum. Members file PAFs there, and a post there is what keeps a trooper from going AWOL.
LOA: Leave of absence: a trooper's notice, filed as a PAF or posted by hand in its own thread in an LOA node, that they will be away for a date range. It belongs to its Subject, and a second LOA is always a new thread.
Needs-review LOA: An LOA that can't be taken as written: its dates can't be read, it ends before it starts, it runs more than 14 days, or it names no member. It covers none of its days. Avoid: malformed LOA, invalid LOA.
PAF: Personnel Action Form: the forum form a personnel action is filed on, such as an LOA request, which names a Submitter and a Subject.
Subject: The trooper an LOA is for, the one going on leave. The bot attributes the LOA to its Subject and nobody else. Avoid: username (bare), because PAFs have carried the Submitter and the Subject under the same Username label.
Submitter: The account that files a PAF. For an LOA, the Subject themselves or someone filing for them, such as their squad lead. Avoid: author, poster.
LOA node: A forum section that holds LOA threads.
AFSM: The Armed Forces Service Medal, given for service in a department. /afsm lists the members of one department who have served in it for a year and have no AFSM for it from the past year.
S6 IT full status: Full membership of the S6 IT team, which a probationary member is promoted to. /s6-it-check lists the members who have held an S6 IT position for six months.
AWOL: A trooper with more than 7 accountable days. The regiment expects a forum post at least once a week, and any post counts. AWOL comes from forum posts alone, never from the milpac.
Accountable day: A UTC calendar date after a trooper's last forum post, up to and including today, that none of their LOAs covers.
LOA tag: The [LOA] or [LOA needs review] mark on a trooper's /awol row, linked to the LOA's thread when the bot knows it. [LOA] marks an LOA that includes today, and [LOA needs review] marks a needs-review LOA that a leader reads before acting on the row. Avoid: tag on its own, which is a picker's selected item; flag, a holder list row's mark; badge.
Accuracy disclaimer: The warning at the top of every /afsm reply, with or without names, that the list may be wrong because milpac records are typed by hand.
Helpline card: The crisis and mental-health services /helpline posts, optionally addressed to a member. Every service on it is an outside organisation. The regiment names no internal crisis contact, since no volunteer roster is staffed, trained and always available the way those services are. A changed phone number or dial sequence on it is a correctness fix, not a copy edit.
The Discord roles the regiment gives members for the game Foxhole, and the
panel page and /foxhole commands that manage who holds them. What a Foxhole
role unlocks is set in Discord, outside the bot.
Foxhole role:
A Discord role the /foxhole commands and the Foxhole page give and take by
its exact name, Internal or External. The bot answers for who holds it,
never for what it unlocks.
Avoid: Warden role (a faction the regiment no longer plays).
Internal / External: The two Foxhole roles, Internal for Cav members and External for outside collaborators from allied groups. The bot enforces neither meaning and checks no rank role before an Internal grant. Avoid: access tier.
War: One Foxhole war, the game's campaign from its start to a victory. Foxhole role membership lasts one war. Avoid: season, round.
Purge: Taking a Foxhole role off every holder in one Foxhole action when a war ends. Re-adding the approved Foxholers afterwards is a separate Foxhole action. Avoid: reset, wipe, clear.
Approval: A Foxhole manager's mark that a Discord member gets one Foxhole role back after every purge, and a member can carry one for each role. It outlives a purge and the member leaving the server, and only a person clears it, by hand or by removing that role from the member on the panel. Avoid: locked (a spawned channel's term), whitelisted, pinned, preset.
Approved Foxholer: A Discord member with an approval for at least one Foxhole role, a Cav member and an outside collaborator alike. Avoid: approved collaborator (an outside one only), approved member (reads as a Cav member), approved player.
Note: A Foxhole manager's free text about one Discord member, one per member, started only on a Foxhole role holder or an approved Foxholer. It outlives a purge, the member losing the role and the member leaving the server, and only a person changes or clears it. Avoid: comment, remark, reason (Discord's audit log word for why a change was made).
Validated internal unit: A position group whose current roster the regiment treats as belonging in Internal, such as D/ACD. Not every unit is one.
Foxhole group: The one forum group whose members are Foxhole managers. Who is in it is decided on the forum. Avoid: warden group, warden allowlist.
Foxhole manager: A signed-in forum user in the Foxhole group, such as a Foxhole leader, who opens the Foxhole page. A panel admin can do everything a Foxhole manager can. Avoid: warden manager, warden admin, Foxhole leader (as the panel's name for the role).
Foxhole page: The panel page that lists every Foxhole role holder and approved Foxholer with their notes, and starts Foxhole actions. Its second view is the no-role view. Avoid: warden page, warden dashboard.
Holder list: The Foxhole page's list of every Foxhole role holder and every approved Foxholer, read from the member list as it stands when the page loads. Avoid: roster (a unit's roster), member list (the bot's copy of the whole guild).
Selection: The members a Foxhole manager has ticked in the holder list. It lasts through searches, filters, visits to the no-role view and reloads of the page, and ends when an Approve, a Clear approval or a removal made from it goes ahead. Avoid: ticked members, selected set. A picker's selected set is its stored items.
Selection bar: The holder list's buttons that act on the selection: Approve, Clear approval, Remove Internal and Remove External. Avoid: toolbar (the list's search and filters), bulk actions.
Action block: One of the three Foxhole page blocks that start Foxhole actions: Add members, Add a unit's roster and After a war. Avoid: action panel, action form.
No-role view: The Foxhole page's second view, which lists the members with a note who hold no Foxhole role and have no approval. Avoid: holder list (nobody in it holds a Foxhole role).
Flag: A display-only mark on a holder list row that points a Foxhole manager at a member worth a second look. The marks are "no rank role" and "discharged" on an Internal holder or a member with an Internal approval who holds no rank role or holds the Discharged role, "not in the server", and "approved, doesn't hold Internal" or "approved, doesn't hold External". Avoid: warning, alert, issue.
Member list: The bot's copy of every member of the guild, which the holder list is read from, partial after each connect until Discord's last part arrives. A resumed session keeps it. Avoid: member cache, roster (a unit's roster is a different list).
Foxhole action:
One change to who holds the Foxhole roles, made on the Foxhole page or by a
/foxhole command: an add, a removal, a roster add, a purge or a re-add of
the approved Foxholers. One started on the page never runs alongside
another from either path, though two commands may still run together.
Avoid: bulk action, job, task, operation, lock (a spawned channel's
state, not the rule that keeps two actions apart), starter for who started
one (a recording's).
Report: The record of one Foxhole action started on the Foxhole page, and that action's change log entry. It names who started the action and how it ended, and lists the members it changed, skipped, failed on and never attempted. Avoid: summary, results, receipt.
Latest report: The report of the most recent Foxhole action started on the Foxhole page, which the page shows above the action blocks. Avoid: current report, last report. "Last" can read as the final one.
Retry: Starting a finished Foxhole action again on only the members its report missed: those it failed on, then those it never attempted. It opens that action's preview, or a purge's or re-add's confirmation, holding only them. Avoid: re-run, resume, re-add (giving approved Foxholers their roles back after a war).
Result line: A line on the Foxhole page telling a Foxhole manager what their last save did that the list alone doesn't show: the members an Approve skipped for holding no Foxhole role, or a cleared note that took its member off the page. Avoid: result note (a note is a Foxhole manager's text about a member), message.
The Discord roles that mark the regiment's winged aviators, one for Arma and
one for DCS, and the /winged-aviator command aviation staff use to give and
take them. Discord's own settings decide what each role unlocks.
Winged Aviator role: Winged Aviator - Arma or Winged Aviator - DCS, the Discord role a winged aviator of that game holds while they are in the server and their milpac shows no discharge. Avoid: wings, aviator role.
Winged aviator:
A member someone gave a Winged Aviator role, with /winged-aviator or by
hand. The status belongs to that role, so a member can have it for both
games. A discharge or leaving the server takes only the role off, and the
status ends when a person removes the role.
Avoid: pilot, approved aviator.
Aviation staff: A/1-7 Staff, A/ACD Staff and Foxhole Staff, who lead the winged aviators. Any of them can make or end any member's status as a winged aviator. Avoid: aviation leadership, aviation managers.
The bot replaces MEE6's "Temporary Channels" plugin. A member joins a hub, the bot creates a spawned channel for them, and the spawned channel is deleted when it empties: at once, or after its hub's delete delay. Hub settings are edited in the panel, never in code.
Hub: A voice channel that, when a member joins it, causes the bot to create a spawned channel and move the member into it. Each hub carries its own settings. MEE6 calls this "join to create". Avoid: join-to-create channel, creation trigger, hub voice channel.
Spawned channel: The voice channel a hub creates for the member who joined it. Named from the hub's base string plus a per-hub number. Avoid: temp channel, temp VC, temporary channel, personal channel.
Owner: The occupant a spawned channel belongs to, or nobody. Owning is what lets a member rename or lock it, as far as its hub allows each; a moderator role does both without owning. The owner was a Cav member when they took the channel, and ceasing to be one in Discord later does not end the ownership. The creator at first, if they are one; after a handover, whoever the handover named. A bot-internal marker that grants no Discord permission. Avoid: interim controller, controller, creator (for the current owner).
Handover: The bot giving ownership of a spawned channel to an occupant. When the owner leaves, the highest-ranked occupant who is a Cav member takes over, ties broken by lowest user ID; with no such occupant the channel has no owner. When a Cav member joins a channel with no owner, they take over. A save of the rank roles applies the rule to every spawned channel at once. At that save, an owner who is no longer a Cav member hands over, and a channel with no owner goes to its highest-ranked occupant who is one. A handover is final: a returning creator is an ordinary occupant. Avoid: hand off, hand back, succession, transfer, loan.
Restart sweep: The bot's check, when it connects, of every spawned channel it holds a stored record of against the guild. A recorded channel that is gone loses its record. An empty one is deleted with its record once its hub's delete delay passes with nobody joining, counted from when it emptied if the bot saw that happen, and otherwise from the sweep. An occupied one is tracked again, its owner restored or elected by the handover rule. A channel with no record is never touched. Avoid: adoption, orphan sweep, recovery, reap, resync.
Spawn in flight: A spawned channel from the moment Discord confirms its create until its row write or compensating delete finishes. A restart sweep that overlaps this interval leaves the channel alone until that sweep also finishes. Avoid: pending spawn, unsettled channel, protected channel, marked channel.
Stale voice state: The bot's record of which channel a member is in, or of who is in a spawned channel, at a moment when Discord has already reported a change the bot has not yet applied. Discord reports changes in order; the bot applies them in no fixed order, so the record can lag. Before it creates, moves or deletes, the bot checks Discord's current state and goes ahead only if the record it decided on still holds at that check. Avoid: stale event, out-of-order event, late event, race.
Ownership notice: The bot message in a spawned channel's text chat that names the current owner, or says there is none. Posted when the channel is created and at every handover. It pings nobody. Avoid: announcement, banner, status line, welcome message.
Moderator role: A Discord role that may rename, lock and unlock any spawned channel it covers without owning it, as far as the hub allows each, and that no lock keeps out. Set per hub, or once for every hub; a hub's moderator roles are the union of the two. Grants no Discord permission beyond getting past a lock. Avoid: staff role, admin role, global moderator, default moderator.
Lock: A spawned channel's state in which only its guests and its hub's moderator roles may join. Everyone else still sees the channel, with Discord's padlock, and cannot read its text chat. The owner or a moderator locks it, on a hub that allows locking. It belongs to the channel, not to whoever set it, and lasts until someone unlocks it or the channel is deleted. Avoid: private channel, closed channel, hide (a hidden channel is out of sight; a locked one is not).
Guest list: The members a locked channel admits: everyone who has been inside it since it locked, however they got in, and everyone let in. Each lock starts a new one; unlock clears it. A guest is one member on it. Avoid: allowlist, whitelist, permit list, invite list.
Let in: To put a member who is outside a locked channel on its guest list. Done by a moderator or by whoever locked the channel. It never shows a member a channel they could not already see. Avoid: admit, invite, permit, allow.
Lock notice: The bot message in a locked channel's text chat that names who locked it and carries the controls to unlock it and to let someone in. Posted at each lock. At unlock it is edited to name who unlocked the channel, and loses its controls. Avoid: lock panel (the panel is the web UI), control panel, tool, widget.
Knock channel: A spawned channel whose name starts with 🚦, asking members outside to knock before they join. A courtesy the bot does not enforce: a knock channel keeps nobody out, where a lock does. The name is its only record. Avoid: soft lock, do not disturb, knocked channel, knock (for the channel or its 🚦).
Knock: A member outside a knock channel asking the people inside whether they may join. Members do it among themselves; the bot plays no part. Avoid: request to join, let in (a lock's term, and done by the bot).
Eligible role:
A live Discord role that is not managed and is not @everyone. The only
kind a role picker offers, and the only kind a save may add.
Avoid: offered role, valid role, pickable role, selectable role.
Unavailable role: A stored role that is no longer eligible, kept with whatever it grants until a person removes it in the panel. Two reasons: deleted, when the role is gone from Discord, and managed. Avoid: legacy role, stale role, orphaned role, ghost role.
Permission source: The per-hub setting that chooses what a spawned channel inherits its permissions from, the hub's category or the hub channel itself. Avoid: sync, category sync, synchronize permissions.
Delete delay: How long a spawned channel must stay empty before the bot deletes it. Set per hub, and read as it stands now, so a change reaches the channels already waiting; none means the moment the channel empties. A join cancels the wait, and the next empty starts it again. Avoid: keep alive (MEE6's term), grace period, linger, timeout, cooldown.
Register: To make an existing voice channel a hub through the panel. The other way a hub comes to exist is the panel creating the channel itself. Avoid: adopt (for a hub), import, link, attach.
Disabled hub: A hub that keeps its channel and its settings but spawns nothing. A join to it does nothing. Its spawned channels live on until empty. Avoid: paused hub, inactive hub, archived hub, hub off.
Broken hub: A hub whose channel is gone from Discord or has no category. Discord's state makes it so, never a panel setting, and the panel works it out each time it shows the hub and never stores it. A join can reach only the no-category kind, and it spawns nothing. Avoid: orphaned hub, stale hub, dead hub, unhealthy hub.
Removed hub: A hub that a removal deleted. The panel keeps its change log, and its voice channel may still be in Discord. Avoid: deleted hub, former hub, archived hub, old hub.
Spawn failure: A join to an enabled hub that ends with no spawned channel for the member. Two kinds: a failure Discord returned on the create or the move-into, and a refusal the bot decided itself, which only a broken hub causes. A join that ends because the member left the hub is not one, however the bot learns of the leave. Avoid: create failure, failed create, failed join, refused join.
Preview: What the panel shows of a change before making it, with the Confirm that makes it. Removing a hub, deleting a recording and every Foxhole action but a re-add have one. So does a rank roles save that stops anyone counting as a Cav member. A purge's, like a Retry's of a purge or re-add, is called its confirmation. Avoid: dry run, summary.
Save: One submitted panel form that changes what the panel stores. It begins once the group check allows it, runs to its end whether or not the browser waits, and takes effect when the store holds the change. A refused save changes nothing. A save that fails leaves the store as it was, though a Discord change it already made may stay. Avoid: submit, submission, write, commit.
Refusal: The answer that turns a request down before anything changes: a command's reply to a run, the note a panel form shows on a refused save, or the no-access page for a request the visitor may not make. Only the person who asked sees it. Avoid: rejection, error reply (which also covers a run that failed after it started).
Unsaved edit: What a panel user typed into a form and has not saved, which the panel brings back marked not saved yet. A Foxhole note the panel keeps through a sign-in is one. Avoid: draft, kept values, kept note.
Change log: The panel's record of each change made through it: who made it, when, and what changed. Every save that takes effect has one entry, holding the old and new values, except a recording's deletion. Every Foxhole action started on the Foxhole page has one too, its report. Each hub's form shows the hub's own entries, and each removed hub's row on the Hubs page shows that hub's, its removal included. The guild-wide moderator section, the rank roles section and the recording roles section each show the entries of their own saves, which reference no hub, and the Foxhole page shows its own. A change made by a command or by hand in Discord has none. Avoid: audit trail, audit log (that is Discord's), history.
Stale form: A form loaded before another save of what it shows took effect, whose own save would undo that save unseen. A save from it is refused. A rename made in Discord does not make a form stale. Avoid: conflict, collision, race, outdated form, edit conflict.
Panel:
cavbot2's web UI at cavbot2.7cav.us. Any forum user can sign in through
the forum, and the group check decides which pages each one sees.
Avoid: dashboard, admin UI, settings screen, config.
Panel session: The panel's record that a browser is signed in as one forum user. Created at the OAuth callback, for any forum user, and holds the Discord ID their milpac names, if any, which finds the recordings they started. When sign-in can't find it for a user with a milpac, a recording page looks again. Ended by sign-out, two hours after sign-in, or by the forum refusing the token or refusing to say who the user is. A group check that grants nothing leaves it running. Avoid: login, token session, forum session, auth cookie.
Pending sign-in: The panel's record of one sign-in between the redirect to the forum and the callback, with the panel page the sign-in comes back to. Consumed by the callback, whatever its outcome, or dropped after five minutes. Avoid: auth request, login attempt, OAuth state, flow.
Group check: The panel's test of the signed-in forum user's forum groups, primary or secondary, on every request. The groups decide what the panel session can see. They never end it. One of the panel's admin groups makes them a panel admin. The Foxhole group makes them a Foxhole manager. An outsider opens the Recordings page alone. Avoid: allowlist check, permission check, authorisation, role check.
Panel admin: A signed-in forum user the group check finds in one of the panel's admin groups. Opens every page and takes every action on the panel. Avoid: admin (bare), staff, allowlisted user, moderator (a spawned channel's), Foxhole manager (a narrower role).
Outsider: A signed-in forum user the group check finds in none of the panel's groups, neither a panel admin nor a Foxhole manager. Opens the Recordings page, which lists the recordings they started, or says they have none yet. Avoid: user outside the admin groups (a Foxhole manager is one too), user in neither group, user in no group, guest, unprivileged user.
No-access page: The panel page for a request the visitor's forum groups don't allow, or for a recording they didn't start. Avoid: forbidden page, access denied page, 403 page.
Settings page: The panel page where a panel admin sets the guild-wide settings that belong to no hub: the rank roles and the recording roles. Avoid: admin page, config page, preferences.
Rail: The side column on every signed-in page: the identity block, Sign out, the version line and a link to each page the visitor may open. Every signed-in visitor may open the Recordings page. Avoid: sidebar, nav, menu.
Block: One bordered unit of a panel page, with a gold header rule. The unit a page's layout rules bound. Avoid: card and section (for a page unit; the helpline card is a Discord message), widget.
Tag: One selected item as a picker shows it, with its remove control. A role picker's tag shows an unavailable role with its reason. Avoid: chip, pill, badge.
Search list: The list of candidates a picker's add control opens, filtered as the person types. A role picker's search offers the eligible roles not yet selected. The register picker's channel search offers the voice channels that are not hubs. Avoid: dropdown, popover, menu, combobox.
Designed in #10. The bot replaces Craig. A member starts a recording of the voice channel they are in, a recorder joins it, and the bot keeps what each speaker said as a separate track.
Recording: The audio of one voice channel captured by a recorder from the moment its starter starts it until it stops, kept as one track per speaker and a mix. A channel has one recording at a time, so a start in a channel already being recorded is refused. Deleted 30 days after it stops, or sooner, whole, by its starter or a panel admin. Avoid: session, capture, craig (as a verb).
Starter: The Cav member holding a recording role who started a recording. Apart from panel admins, the only person who can pull it from the panel. Avoid: owner (a spawned channel's), host, requester, recorder.
Recorder: A Discord account, separate from the bot's own, that joins a channel to record it and is in voice only while it records. Each records one channel at a time, so a recording starts only when a recorder is free. Temp VC never counts a recorder as an occupant. With none configured, nobody can record. Avoid: recording bot, Craig, the bot (for this account).
Offline recorder: A recorder logged out of Discord and logging back in by itself, after a cut-short recording or a leave of its channel that hung, or since its first login at startup failed. A start that finds no free recorder online waits for one. Avoid: reconnecting recorder, restarting recorder.
Recording role: A Discord role, set once for the guild in the panel, whose holders may stop a recording in a channel they are in, and start one if they are Cav members. With none set, nobody can record. Avoid: recorder role, record permission, recording permission.
Track: One speaker's audio for the whole of a recording, silent wherever they were not talking, so every track in a recording lines up from its start. A speaker who leaves and rejoins keeps one track. Avoid: stream, channel (that is Discord's), file.
Speaker:
Anyone the recorder heard during a recording. They stay a speaker when their
track was lost, so the recording still says who was in the room. Not
necessarily a Cav member: an applicant in an S2 interview is a speaker. A
recruit holds the RCT rank role, so is a Cav member; an applicant holds
none.
Avoid: participant, attendee, member (for this role).
Lost track: A speaker's track the recorder could not keep writing, so their audio is gone or stops early. The speaker stays listed, and the recording says so beside their name wherever it names its speakers. Avoid: missing track, failed track, broken track.
Gap: A stretch of a recording when the recorder could not hear the channel, because its connection to the voice server dropped, the call moved to a voice server it had not reached yet, its encryption setup stalled, nothing came from the voice server, nothing it received could be decrypted, or someone server-deafened it. Every track is silent there, whether or not anyone spoke. One that reaches 10 seconds ends the recording as cut short. Avoid: dropout, outage, stall (one cause of a gap).
Mix: One file of every track in a recording played together, built when the recording stops. A recording with no speakers has no mix. Avoid: mixdown, combined track, merged audio.
Info file: The text file kept with a recording, and in its zip, that names its title, channel, starter, start and stop times in Zulu, how it ended, and each speaker's display name and Discord ID, marking a lost track. Avoid: metadata, manifest, readme.
Cut-short recording: A recording that ended because the bot shut down or crashed, or because the recorder could not hear the channel for 10 seconds, rather than by a stop, the time cap, or the last person leaving. What it captured up to then is kept. Avoid: failed recording, aborted recording, broken recording.
Recordings page: The panel page every signed-in forum user opens, listing the recordings they started, with each one's downloads, its deletion date and a Delete that removes it sooner. One who started none reads that there are none yet. One the panel can't yet find in Discord reads why, and what to do. A panel admin can switch it to every recording. The link a recording notice gets at stop opens the recording here. Avoid: recordings dashboard, recordings list.
Recording notice: The bot message in the recorded channel's text chat that says a recording is running, names its starter, and carries the control to stop it. Posted at start, taken down if the start then fails, and edited at stop to say it stopped, or that it was cut short, with a link to the recording in the panel. The starter gets that link by DM as well when the channel is a spawned channel, since its hub's delete delay takes the notice away once everyone has left, and instead when the notice is gone by then. Avoid: recording panel (the panel is the web UI), banner, announcement.
7Cav API: The regiment's web API at api.7cav.us, where the bot reads milpacs, rosters and LOAs.
Bot Postgres: The bot's own database, and the only one it writes to.
Usage goes to the regiment's Grafana stack at metrics.7cav.us, and failures go to Sentry. Neither one carries the other's signal (ADR 0011).
Command telemetry: The usage record of one slash command run: which command, how long it took and who ran it. It never records a failure.
Missed acknowledgement: An interaction Discord dropped because the bot's acknowledgement did not reach Discord within 3 seconds of the interaction's creation. The member sees "The application did not respond". Avoid: expired interaction (the 15-minute limit on editing a reply is a different limit), timeout.
Abandoned page load: A panel page load whose connection closed before the panel answered and before the page's time budget ran out. Usually the browser left, by navigating away, reloading or closing the tab. It is expected, not a failure, so it leaves an INFO line and no Sentry event. A page still loading when its budget runs out has failed, and is not an abandoned page load. Neither is a load whose read failed for its own reason as the connection closed. Avoid: browser leaving, client disconnect, cancelled request, timeout.
Time budget: The one deadline shared by every read a panel page load makes, and by any wait for Discord to send the bot the guild's data or the member list, starting when the page begins reading. A load still reading when it runs out fails at once, whatever read it is waiting on, and the page says it took too long. A load still waiting on Discord fails at once too, and the page says Discord has not sent the data. The Foxhole page is the exception. It shows everything that doesn't need the member list, with a notice in place of the rest. Downloading a recording's mix or zip has no time budget. Avoid: page timeout, deadline.
Failed start: A start of the bot that ends before the bot is running, because a startup step failed. A stop during startup is not a failed start, but a step that fails for its own reason while a stop is waiting still is. A failure while the bot shuts down is not one. Avoid: crash, boot failure, startup panic.
Gateway outage: The span from a gateway session, the bot's own or a recorder's, losing its connection to Discord, other than by a close on purpose as at shutdown, until Discord next answers the session with READY or RESUMED. An offline recorder is in one until it logs back in. One that lasts a minute sends one Sentry event however long it goes on, and one that ends sooner sends nothing. Avoid: disconnect (the moment it starts), downtime.