Triage Slack issue reports with one thread-only verdict, evidence review, cause-aware routing, tracker dedupe, and fail-closed ticket creation. Use only from the configured Benny triage automation.
68
82%
Does it follow best practices?
Run evals on this skill
Adds up to 20 points to the overall score
View guide
Low
Low-risk findings worth noting
Classify one Slack report and post one useful verdict in its source thread. Create a tracker issue only for a clear, new bug. Do not reproduce or fix it here.
Load the external Benny configuration supplied by the automation. If the config is missing, malformed, or incomplete, stop without posting or writing to the tracker.
SendSlackMessage, PostToSlack, chat.postMessage, and every other Slack write.principle-separate-before-serializing-shared-state to source coordinates.principle-minimize-reader-load and unslop skills to the final verdict.Before making a work list or delegating:
source_channel_id from the trigger.SOURCE_THREAD_TS to trigger.thread_ts when present. Otherwise use trigger.ts.SOURCE_THREAD_TS.SOURCE_CHANNEL_ID and SOURCE_THREAD_TS as immutable values.Every later source read and post must use those stored values. Never replace them with a reply timestamp or an operations-thread timestamp.
Read the root and current replies before deciding.
Capture:
Inspect every relevant attachment.
Use evidence already in the thread before asking the reporter for more.
Do a bounded source and history pass before choosing an owner or destination. Use pstack's how skill to trace the path from the reported action to the observed result. Use why when the report looks like a regression or touches defensive code.
This pass does not need a complete root cause. It must be strong enough to avoid routing a visible symptom to the wrong owner.
If the repository cannot be read, do not guess a code owner. Continue with a conservative classification and say that cause tracing was unavailable.
Choose one category.
Something violates intended behavior. Examples include wrong output, broken state, an error, a crash, a hang, a silent no-op, or a regression.
The report describes measurable slowness, excess memory, battery drain, jank, or another resource problem. Treat it as a bug, but preserve measurements and profiles.
The current behavior appears intentional and the reporter wants a different behavior or affordance.
The report asks how something works, expresses a preference without a concrete defect, or gives general feedback.
Cause tracing shows that another configured destination owns the issue.
When the bug versus feature line is unclear, do not file. The one verdict may ask one focused question and use the other marker.
Read the optional routing map from routing.map_path.
Owner pings are off by default. A ping is allowed only when all of these hold:
No other case gets a ping.
The tracker is an adapter, not a required vendor. A Linear adapter is one valid example. A GitHub Issues adapter or another tracker may implement the same contract.
The configured adapter must provide:
If a required operation is unavailable, fail closed for that write.
Resolve configured team, project, status, and labels at runtime. Do not invent IDs, create labels, assign owners, or set priority unless the config explicitly requires it.
Always check whether this source permalink is already linked to a tracker issue or a prior triage reply. If so, do not post or create a duplicate.
For bugs and performance reports, search the tracker using:
Choose one outcome:
For a confident duplicate, update the existing issue with the source permalink and one short recurrence note. Do not reopen, relabel, or reassign it unless the config says to.
For a possible match, link it in the verdict as uncertain and create nothing.
A long-closed issue is a regression lead, not automatically a live duplicate.
Create only when all of these are true:
Never create for a feature request, question, feedback item, reroute, possible duplicate, confident duplicate, or already-fixed issue.
The new issue must be self-contained:
unknownDo not put a guessed root cause in the title.
Run a fresh source-parent preflight. Then post exactly one reply with channel=SOURCE_CHANNEL_ID and thread_ts=SOURCE_THREAD_TS.
Never call a source-channel posting action without a nonempty thread_ts.
Keep the reply short:
Marker contract:
[benny:bug]
[benny:bug] tracker=https://tracker.example/issue/123
[benny:performance]
[benny:performance] tracker=https://tracker.example/issue/123
[benny:other]Use only the configured marker strings. The repro automation trusts the marker only when it comes from the configured triage identity in this source thread.
After posting, read the same source thread and verify the verdict appears under SOURCE_THREAD_TS. If it does not, never retry at the root.
If this run created a tracker issue and the verdict did not land, use the adapter's compensation action. Verify that the issue is canceled, closed, or deleted. If compensation cannot be verified, report the failure only in the automation run output.
Watch the source thread for the configured follow-up window, then stop.
Do not extend the window more than once. A new report should start a new run.
c47b128
If you maintain this skill, you can claim it as your own. Once claimed, you can manage eval scenarios, bundle related skills, attach documentation or rules, and ensure cross-agent compatibility.