Skip to Content
v1.32.0 · shipped See what shipped. Read the changelog →

Slack app plugin

Triage a bug from the channel it lands in. Mushi posts each classified report as a Block Kit card carrying the plain-English title, root cause, and evidence counts — and the card’s buttons let you dispatch a fix, resolve, or dismiss without opening the console.

Why it exists — the fastest triage is the one that doesn’t need a second tab.

Who it’s for — teams whose bugs already get discussed in Slack.

Setup

  1. Create a Slack app with bot scopes in your workspace.
  2. In Mushi: Marketplace → Slack → Install, then paste the bot token + signing secret.
  3. Pick the channel for report notifications, and optional thread replies on QA failures.
  4. Point Slack’s Interactivity → Request URL at <functions-url>/slack-interactions so the card buttons work.

What’s on the card

ElementWhat it tells you
HeaderSeverity, category, project — plus (N×) when the bug is a repeat
TitleThe plain-language headline (“Checkout button does nothing”), with the technical summary beneath it
🔍 lineLikely root cause from Stage 2
Context rowArea · component · confidence · reporter · environment · page · release
Evidence rowConsole errors, failed requests, repro-step count, screenshot, SDK version
FooterReport id and session id

Rows only render when there’s something to show, so a thin report stays a small card.

Acting from the channel

ButtonWhat happens
Triage →Opens the report in the console, scoped to the right project
Dispatch fixRuns the fix agent and opens a draft PR. Swaps to Install GitHub App / Enable Autofix when the prerequisites are missing
Resolve ✓Marks the report resolved and notifies the reporter
DismissMarks it dismissed (noise, duplicate, won’t fix), behind a confirm dialog
Reply to reporterOpens a box for a message the person who reported the bug sees word for word in “Your reports” in your app. Only shown when the report came from your app’s widget

Resolve and Dismiss run the same transition contract as the console — plugin event, linked-issue resolution, and reporter notification — so acting from Slack and acting from the web app can’t drift apart.

After an action the card rewrites itself in place: the button row is replaced with an outcome line naming who acted and when, and a threaded reply records it in channel history.

Assign is deliberately absent. Reports have no assignee column, so an “Assign” button would be a UI with nothing behind it.

Slash commands

With Slash Commands → /mushi pointed at <functions-url>/api/v1/webhooks/slack/commands, the hosted app answers:

CommandWhat happens
/mushi listThe latest 10 open reports, linked to the console
/mushi open <id>One report’s summary and console link
/mushi resolve <id>Marks it resolved, the same as the card’s Resolve ✓
/mushi reply <id> <message>Answers the person who reported it. Same path as Reply to reporter: they see your message word for word in your app, and get an email or push only if they opted in
/mushi voice <text>Voice intake by text; see Voice intake

<id> is the full report id or its first 6+ characters. Replies are capped at 2,000 characters and only reach reports filed from your app’s widget.

The reporter sees a reply from “Developer”. Every reply sent from Slack, by /mushi reply or the card’s button, also writes a report.reporter_replied entry to the console’s audit log naming the Slack user (and, for the command, the channel) it came from.

Package

@mushi-mushi/plugin-slack-app

The /mushi slash command (list, open <id>, resolve <id>) ships in this package for hosts that mount it themselves.

Events

EventAction
report.created / report.classifiedPost the Block Kit card to the channel
fix.pr_openedThread with the PR link
qa_story.failed / qa_story.recoveredTransition-aware threaded updates

Troubleshooting

SymptomCause
Buttons do nothingInteractivity Request URL not set, or the signing secret doesn’t match
Cards post but Triage 404sADMIN_BASE_URL unset on the server — the deep link can’t be built
No cards at allNo bot token for the project, and no slack_webhook_url fallback configured
Last updated on