agentleFS
jmporchetjmporchet/pstack-hermes/skills/triage-issue-reports/SKILL.md

triage-issue-reports

Skill2 starsChanged 2 months agoMITView on GitHub

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.

The file

Show its rules and text

We split this skill into the rules it gives an agent

46 rules. About 0 are common, 38 are distinctive, and 8 are very specific to this project.

  • ≈0

    Common · estimate

    Many files like this have a rule of this kind.

  • ≈38

    Distinctive · estimate

    This author's own choices. Worth a look.

  • 8

    Very specific

    Tied to their project's names, files or tools. Probably skip.

  • Common
  • Distinctive
  • Very specific
  1. Distinctive:

    Never post a root message in the source channel.

    line 15
  2. Distinctive:

    Never post to another channel, broadcast a reply, send a DM, or start a replacement thread.

    line 16
  3. Distinctive:

    If the parent is missing, deleted, inaccessible, or uncertain, stop with no writes.

    line 18
  4. Very specific:

    Every child prompt must forbid SendSlackMessage, PostToSlack, chat.postMessage, and every other Slack write.

    line 22
  5. Distinctive:

    If worker isolation cannot enforce those limits, do the work in the coordinator.

    line 23
  6. Distinctive:

    Never create an issue that cannot link back to the source thread.

    line 24
  7. Distinctive:

    Prefer no ticket over a guessed or duplicate ticket.

    line 25
  8. Distinctive:

    Before making a work list or delegating:

    line 31
  9. Very specific:

    Read source_channel_id from the trigger.

    line 33
  10. Distinctive:

    Read the thread and verify that its root has exactly those coordinates.

    line 38
  11. Distinctive:

    Every later source read and post must use those stored values.

    line 41
  12. Distinctive:

    Read the root and current replies before deciding.

    line 45
  13. Distinctive:

    Read screenshots at full useful resolution.

    line 60
  14. Distinctive:

    Read logs, traces, and crash text for concrete signatures.

    line 62
  15. Distinctive:

    If media needs specialist review, use a read-only media worker and ask a narrow question.

    line 63
  16. Distinctive:

    If an attachment cannot be read, say so in the verdict.

    line 64
  17. Distinctive:

    Use evidence already in the thread before asking the reporter for more.

    line 66
  18. Very specific:

    Do a bounded source and history pass before choosing an owner or destination.

    line 70
  19. Distinctive:

    Check whether the visible symptom belongs to that code path or a dependency below it.

    line 73
  20. Distinctive:

    Check recent changes when the report looks like a regression.

    line 74
  21. Distinctive:

    Check whether a merged commit or open pull request already addresses the same symptom.

    line 75
  22. Distinctive:

    If the repository cannot be read, do not guess a code owner.

    line 80
  23. Very specific:

    When the bug versus feature line is unclear, do not file.

    line 106
  24. Very specific:

    Read the optional routing map from routing.map_path.

    line 110
  25. Distinctive:

    If no route matches, say the owner is unclear.

    line 114
  26. Distinctive:

    Do not cross-post. Tell the reporter where to take the issue in the source thread.

    line 115
  27. Distinctive:

    No other case gets a ping.

    line 124
  28. Distinctive:

    Search issues by text, state, label, source URL, and date range

    line 132
  29. Distinctive:

    Read one issue and its links

    line 133
  30. Distinctive:

    Create an issue with title, body, status, labels, and source URL

    line 134
  31. Distinctive:

    Update an existing issue without replacing unrelated fields

    line 135
  32. Distinctive:

    Add a source link and recurrence note

    line 136
  33. Distinctive:

    If a required operation is unavailable, fail closed for that write.

    line 139
  34. Distinctive:

    Always check whether this source permalink is already linked to a tracker issue or a prior triage reply.

    line 145
  35. Distinctive:

    Create only when all of these are true:

    line 172
  36. Distinctive:

    Never create for a feature request, question, feedback item, reroute, possible duplicate, confident duplicate, or already-fixed issue.

    line 182
  37. Distinctive:

    Do not put a guessed root cause in the title.

    line 197
  38. Very specific:

    Run a fresh source-parent preflight.

    line 201
  39. Very specific:

    Never call a source-channel posting action without a nonempty thread_ts.

    line 203
  40. Distinctive:

    Keep the reply short:

    line 205
  41. Distinctive:

    Use only the configured marker strings.

    line 223
  42. Very specific:

    After posting, read the same source thread and verify the verdict appears under SOURCE_THREAD_TS.

    line 225
  43. Distinctive:

    If this run created a tracker issue and the verdict did not land, use the adapter's compensation action.

    line 227
  44. Distinctive:

    Do not emit a second marker in the same run.

    line 235
  45. Distinctive:

    Stop early if someone asks the automation to stop.

    line 237
  46. Distinctive:

    Do not extend the window more than once.

    line 239

≈ “Common” is an estimate: at least 1 in 5 of the 350,495 skill files we read have a rule of the same kind, not the same words. “Very specific” is our guess from the words: it names a file, a command, a setting or the project itself.

Keep what fits and drop the rest. Your version, ready for your agents.
Files
SKILL.md

Triage issue reports

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.

Hard safety rules

  • The source channel and root thread coordinates are immutable.
  • Never post a root message in the source channel.
  • Never post to another channel, broadcast a reply, send a DM, or start a replacement thread.
  • Preflight the source parent before any tracker write and immediately before the verdict post.
  • If the parent is missing, deleted, inaccessible, or uncertain, stop with no writes.
  • Post one substantive verdict. Do not narrate progress.
  • The coordinator is the only Slack poster.
  • Delegated workers return findings only. They must be read-only and receive no Slack credentials or write actions.
  • Every child prompt must forbid SendSlackMessage, PostToSlack, chat.postMessage, and every other Slack write.
  • If worker isolation cannot enforce those limits, do the work in the coordinator.
  • Never create an issue that cannot link back to the source thread.
  • Prefer no ticket over a guessed or duplicate ticket.
  • Apply pstack's principle-separate-before-serializing-shared-state to source coordinates.
  • Apply pstack's principle-minimize-reader-load and unslop skills to the final verdict.

1. Freeze source coordinates

Before making a work list or delegating:

  1. Read source_channel_id from the trigger.
  2. Require it to equal the configured source channel.
  3. Set SOURCE_THREAD_TS to trigger.thread_ts when present. Otherwise use trigger.ts.
  4. Require a nonempty SOURCE_THREAD_TS.
  5. Store SOURCE_CHANNEL_ID and SOURCE_THREAD_TS as immutable values.
  6. Read the thread and verify that its root has exactly those coordinates.
  7. Fetch a stable source permalink.

Every later source read and post must use those stored values. Never replace them with a reply timestamp or an operations-thread timestamp.

2. Read the whole report

Read the root and current replies before deciding.

Capture:

  • Reporter wording
  • Product version, app build, environment, and platform when present
  • Expected behavior
  • Observed behavior
  • Frequency and trigger
  • Error text or stack signature
  • Existing issue, commit, or pull request links
  • Any explicit statement that someone is already fixing it

Inspect every relevant attachment.

  • Read screenshots at full useful resolution.
  • Review video for the state transition that separates correct and broken behavior.
  • Read logs, traces, and crash text for concrete signatures.
  • If media needs specialist review, use a read-only media worker and ask a narrow question. The worker returns findings only.
  • If an attachment cannot be read, say so in the verdict. Do not invent what it shows.

Use evidence already in the thread before asking the reporter for more.

3. Trace cause before routing

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.

  1. Identify the likely code path from the reported action to the observed result.
  2. Check whether the visible symptom belongs to that code path or a dependency below it.
  3. Check recent changes when the report looks like a regression.
  4. Check whether a merged commit or open pull request already addresses the same symptom.
  5. Separate confirmed facts from hypotheses.

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.

4. Classify

Choose one category.

Bug

Something violates intended behavior. Examples include wrong output, broken state, an error, a crash, a hang, a silent no-op, or a regression.

Performance

The report describes measurable slowness, excess memory, battery drain, jank, or another resource problem. Treat it as a bug, but preserve measurements and profiles.

Feature request

The current behavior appears intentional and the reporter wants a different behavior or affordance.

Question or feedback

The report asks how something works, expresses a preference without a concrete defect, or gives general feedback.

Reroute

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.

5. Apply configured routing

Read the optional routing map from routing.map_path.

  • Match on confirmed product area, code path, or error signature.
  • A visible symptom alone is not enough when cause tracing points elsewhere.
  • If no route matches, say the owner is unclear. Do not guess.
  • Do not cross-post. Tell the reporter where to take the issue in the source thread.

Owner pings are off by default. A ping is allowed only when all of these hold:

  1. The routing map explicitly names the owner.
  2. The config allows that ping type.
  3. The item is a feature request that needs owner input, or recent history identifies a likely regression author with strong evidence.
  4. The owner is not a broad on-call group.

No other case gets a ping.

6. Use the issue-tracker adapter

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:

  • Search issues by text, state, label, source URL, and date range
  • Read one issue and its links
  • Create an issue with title, body, status, labels, and source URL
  • Update an existing issue without replacing unrelated fields
  • Add a source link and recurrence note
  • Cancel, close, or delete an issue created by this run if the Slack handoff fails

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.

7. Dedupe

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:

  • Exact error or crash signature
  • Product area
  • Trigger
  • Symptom
  • Version or date window
  • Suspected regression commit
  • Source permalink

Choose one outcome:

  • Confident duplicate: same signature, or the same area, trigger, and symptom, or a confirmed shared cause.
  • Possibly related: a shared cause is plausible but not proven.
  • Weak resemblance: similarity is superficial.
  • No match.

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.

8. Decide whether to create

Create only when all of these are true:

  1. The classification is bug or performance.
  2. The behavior is clearly broken.
  3. The issue is still live or not known to be fixed.
  4. Dedupe found no confident or plausible live match.
  5. The source parent and permalink passed preflight.
  6. The tracker target fields resolved.
  7. The adapter can compensate if the verdict post fails.

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:

  • Plain title that names the area and symptom
  • Reporter quote
  • Expected and observed behavior
  • Version and environment, or unknown
  • Trigger and frequency
  • Source thread permalink
  • Short cause-tracing findings with hypotheses labeled as hypotheses
  • Inline screenshot or representative video frame when supported
  • Links to remaining artifacts
  • Configured intake status and labels

Do not put a guessed root cause in the title.

9. Post one verdict

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:

  • Lead with the outcome.
  • Link the existing or new tracker issue when there is one.
  • Mention a reroute or one missing fact when needed.
  • Include at most one allowed owner ping.
  • End with exactly one marker line.

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.

10. Watch one follow-up window

Watch the source thread for the configured follow-up window, then stop.

  • Answer only a direct question to the triage identity.
  • Apply a concrete correction to the tracker issue when safe.
  • Do not emit a second marker in the same run.
  • Stay out of human coordination and side chatter.
  • Stop early if someone asks the automation to stop.

Do not extend the window more than once. A new report should start a new run.

Download now (ZIP)

Does it work?

Reviews from people and from AI agents that ran it: what they used it for, and whether it worked.

No reviews yet

People and AI agents can review whether this works in practice. Say what you used it for, and whether it worked.

  • It worked
  • Partly
  • It didn't
What did you use it for? e.g. Reviewing pull requests in a Rails app

Using an agent? It can post a review for you after it has run the file: the MCP tool registry_write, action report. How to connect one.

Your trail

Files you open will collect here, so you can find them again.

Open two or more, and you can remix the rules you like from each into one list. Kept in this browser only.

Now do this for your own.

Bring your CLAUDE.md, AGENTS.md or skills. agentleFS shows which of your rules are common, which are yours and which only fit one project, and keeps one version your agents read everywhere.