Decisions captured from product direction
- Dedicated channel for organizer triage (new, separate from general organizers chat)
- Role-gated access based on a configurable set of Discord role IDs
- Finalize button lives in the card’s thread (fallback: on the card if thread can’t be created)
- Default recommendation threshold = 3 votes, configurable
FOR IMMEDIATE RELEASE
A Discord-native triage inbox with role-gated voting, threaded discussion, and one-click final decisions.
New York, NY — Rust NYC today announced TalkTriage, a Discord-native review pipeline that replaces ad-hoc spreadsheets and scattered DMs with a dedicated organizer inbox channel inside Discord. When a speaker submits a talk, TalkTriage posts a structured “review card” into a private triage channel where organizers can vote with one click, open a focused discussion thread, and finalize a decision—without leaving the place they already coordinate.
Volunteer organizing teams are often limited not by the quality of their communities, but by the overhead of triaging submissions. TalkTriage reduces that overhead by turning every submission into a single source of truth: the abstract, links to the speaker discussion channel, the live vote tally, and decision history.
TalkTriage is role-gated so only authorized reviewers can vote or finalize decisions. Once a decision is finalized, the bot automatically posts a clear status update into the speaker’s submission channel—reducing uncertainty and ensuring speakers get timely feedback.
“We wanted a workflow that felt native to Discord. TalkTriage doesn’t add another tool—it turns Discord into the tool.” — Rust NYC organizers
Availability: TalkTriage will roll out first to Rust NYC’s organizer team. The initial release focuses on the triage inbox, voting + tallying, and thread-based decision finalization. Scheduling handoff and analytics will follow as separate phases.
Job to be done: “Keep the queue moving, align as a team, and make decisions quickly—with minimal overhead.”
Pain today:
Job to be done: “Know my talk was seen, understand what happens next, and get a timely answer.”
TalkTriage is a dedicated, role-gated Discord triage inbox where submissions become review cards with one-click voting, a linked discussion thread, and a finalize button that turns consensus into action.
#talk-triage (dedicated inbox)#talk-triage with interactive controls/triage — show queue (grouped by status + aging)/talk <id> — view details + jump links (optional MVP; can be phase 1.5)POST /api/discord/interactions (Discord Interactions webhook)Existing flow remains:
New addition: also create a TalkTriage review card in #talk-triage.
A single message containing:
Controls on the card:
The action panel includes:
Finalizing:
Fallback: if thread creation fails, the finalize buttons are posted directly on the review card message.
/triage returns an organizer-only view:
Message content (example):
🎤 Talk Submission #42 \ Status: Pending
Speaker: Jane Doe
Submission: Submitted by speaker (or “on behalf of …”)
Abstract (excerpt):
Rust lifetimes are hard—this talk explains… (first 400–800 chars)
Speaker channel: <#123456789012345678>
Votes: ✅ 2 · 🤔 1 · ❌ 0
Recommendation: (not yet)
Components (buttons):
Notes:
Header: “Decision panel for Talk #42”
Shows:
Buttons:
Optional (later): “Request more info” button that posts a template in speaker channel.
Only users with at least one of the configured roles may:
/triage outputDISCORD_REVIEWER_ROLE_IDS — comma-separated list of role IDsDISCORD_TRIAGE_CHANNEL_ID — where review cards are postedDiscord interaction payloads include member.roles for guild interactions. We check:
If unauthorized:
TALKTRIAGE_MIN_ACCEPT_VOTES (default 3)Important: thresholds should influence recommendation and/or enabling finalize buttons, but finalization is always explicit and role-gated.
Maps a submission to its review card message/thread.
submission_id (PK)triage_channel_idreview_message_idreview_thread_id (nullable)created_atOne vote per reviewer per submission.
submission_idreviewer_discord_idvote enum: accept | maybe | passupdated_atsubmission_id, reviewer_discord_id)Current status.
submission_id (PK)status enum: pending | reviewing | accepted | waitlist | declinedupdated_atupdated_by_discord_idAppend-only audit trail.
idsubmission_idfrom_status, to_statuschanged_by_discord_idnote (nullable)created_atpending (default)reviewingacceptedwaitlistdeclinedpending → reviewing (optional automatic when first vote arrives)pending/reviewing → accepted | waitlist | declined (finalize)accepted/waitlist/declined → reviewing (admin override only; logs history)When finalizing, post into the speaker channel:
Accepted: “🎉 Your talk has been accepted! Next we’ll coordinate scheduling in this channel.”
Waitlist: “🟨 Your talk is on the waitlist. We loved it—timing and slots are the only constraint. We’ll update you as soon as we can.”
Declined: “Thank you for submitting. This one isn’t the right fit for our upcoming slots, but we’d love to see you submit again. If you’d like feedback, reply here.”
(Exact tone TBD by Rust NYC.)
It separates high-signal review activity from general organizer chat, and gives an always-up-to-date “inbox” view. It also makes permissioning and automation simpler.
Role-gating protects against accidental permissions drift, makes it safe to share the triage channel with non-review organizers (e.g., logistics), and enables consistent enforcement on all interactive actions.
Final decisions are the highest-risk action. Putting finalize controls in the thread reduces accidental clicks, encourages discussion, and gives a clear audit trail next to the rationale.
If Discord thread creation fails (permissions or configuration), TalkTriage falls back to placing finalize buttons directly on the review card.
No—thresholds are configurable. The system uses thresholds to inform recommendations and (optionally) to enable finalize buttons, but humans can still finalize explicitly.
This design intentionally uses Discord Interactions (HTTP callbacks) rather than emoji reaction events that typically require a persistent Gateway connection.
Net-new capabilities needed in code:
DISCORD_PUBLIC_KEY)DiscordService.sendMessage() to support embeds + components (buttons), not just plain text/triage command