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
- Create a Slack app with bot scopes in your workspace.
- In Mushi: Marketplace → Slack → Install, then paste the bot token + signing secret.
- Pick the channel for report notifications, and optional thread replies on QA failures.
- Point Slack’s Interactivity → Request URL at
<functions-url>/slack-interactionsso the card buttons work.
What’s on the card
| Element | What it tells you |
|---|---|
| Header | Severity, category, project — plus (N×) when the bug is a repeat |
| Title | The plain-language headline (“Checkout button does nothing”), with the technical summary beneath it |
| 🔍 line | Likely root cause from Stage 2 |
| Context row | Area · component · confidence · reporter · environment · page · release |
| Evidence row | Console errors, failed requests, repro-step count, screenshot, SDK version |
| Footer | Report 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
| Button | What happens |
|---|---|
| Triage → | Opens the report in the console, scoped to the right project |
| Dispatch fix | Runs 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 |
| Dismiss | Marks it dismissed (noise, duplicate, won’t fix), behind a confirm dialog |
| Reply to reporter | Opens 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:
| Command | What happens |
|---|---|
/mushi list | The 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
The /mushi slash command (list, open <id>, resolve <id>) ships in this
package for hosts that mount it themselves.
Events
| Event | Action |
|---|---|
report.created / report.classified | Post the Block Kit card to the channel |
fix.pr_opened | Thread with the PR link |
qa_story.failed / qa_story.recovered | Transition-aware threaded updates |
Troubleshooting
| Symptom | Cause |
|---|---|
| Buttons do nothing | Interactivity Request URL not set, or the signing secret doesn’t match |
| Cards post but Triage 404s | ADMIN_BASE_URL unset on the server — the deep link can’t be built |
| No cards at all | No bot token for the project, and no slack_webhook_url fallback configured |