Skip to content

Commit f8ef8b4

Browse files
Triage bot: require a one-line bug statement, restated or retracted on follow-up (#5441)
* feat(triage): require a one-line bug statement, restated or retracted on follow-up The triage bot's bug declarations can bury the actual claim in prose, leaving the reporter's vague title as the only visible problem statement (#5390). Require a concise one-line statement of the fault whenever the bot classifies as bug, and require follow-up reviews to either restate or explicitly retract that statement rather than let it stand unexamined. Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com> * fix: scope the restate-or-retract rule to statements that actually exist Early-exit gates (step 1a/1b) can label an issue bug without reaching step 3, so no one-line statement is ever written for them. Clarify the follow-up rule doesn't apply in that case, so the bot isn't told to hunt for a line that was never produced. Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com> * fix: clarify step 9's bug-statement clause excludes gate-only paths Gates 1a/1b apply a type label without reaching step 3, so there is no one-line statement to carry into the comment on those paths. Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com> * fix: close the soft-gate escape hatch on restating/retracting a bug statement Tie the standing-claim check to the exact comment step 1 locates (rather than an implied scan of "any prior comment"), and require the statement to be restated even when unchanged, matching the existing "say so" rule for classification/priority/root-cause. The previous "if one is in play" wording let an agent skip the restate/retract on a round where new evidence happened not to touch the bug claim. Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com> * fix: require the bug statement when follow-up first reclassifies to bug The restate/retract rule only fired when a prior comment already carried a statement, so a follow-up that newly reclassifies an issue to bug (from configuration/question/unclear) never wrote one - defeating the point for exactly the issues this feature exists to catch. Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com> * fix: carry the bug statement into a duplicate-close comment A high-confidence duplicate close (step 4) runs after step 3 writes the one-line bug statement, but used its own terse comment template that never mentioned it - silently dropping the statement on exactly the close path step 9's full template doesn't reach. Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com> * fix: drop a stale bug statement if investigation reverses the call, split run-on step 9 sentence Step 5's investigation can show the step 3 classification was wrong (bug -> actually configuration), but nothing told the agent to revise or drop the now-stale one-line statement before step 9 posts it. Also split step 9's single run-on sentence so the bug-statement conditional isn't buried inside the general comment-content list. Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com> * fix: point issue-pr at the triage comment's bug statement issue-pr builds its PR from the triage comment's classification, priority and root-cause pointer, but had no pointer to the new one-line bug statement - risking the PR summary restating the reporter's vague symptom instead of the verified fault. Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com> * fix: point issue-pr at the latest bug statement, not just the first-pass one A follow-up review can write the first bug statement for an issue (on a reclassification) or supersede the original with a sharpened one. issue-pr's pointer only named the first-pass comment, so it could use a stale or absent claim when a follow-up comment is the real source. Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com> * fix: cover gate-applied bug labels that have no bug statement The split and evidence gates apply a type label without investigating, so a bug label can exist with no one-line statement. issue-pr now stops and asks for a full triage instead of falling back to the reporter's title, and issue-triage-followup writes the statement on the first full investigation that confirms the bug, even when the label is already there. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com> * fix: write a fresh bug statement when a retracted issue becomes a bug again The follow-up rule keyed on "no earlier bot comment has a statement", so an issue whose statement was retracted and that later went back to bug kept the stale, retracted one as cover. It now keys on whether there is a live statement to restate, and issue-pr ignores retracted statements. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com> --------- Co-authored-by: Claude Sonnet 5 <noreply@anthropic.com>
1 parent 0dab350 commit f8ef8b4

3 files changed

Lines changed: 17 additions & 3 deletions

File tree

‎.claude/skills/issue-pr/SKILL.md‎

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -14,7 +14,9 @@ This skill assumes the issue has already been triaged — the daemon only invoke
1414

1515
## 1. Read the ticket
1616

17-
Fetch it with `gh issue view <number> --json title,body,labels,comments`. The bot's own triage comment (opens with "automated first-pass triage") already has the classification, priority, and any root-cause pointer — start from there rather than re-investigating from scratch.
17+
Fetch it with `gh issue view <number> --json title,body,labels,comments`. The bot's own triage comment (opens with "automated first-pass triage") already has the classification, priority, and any root-cause pointer — start from there rather than re-investigating from scratch. If it's labelled `bug` and the triage reached a full investigation, the comment also has a one-line statement of the fault right after the classification — use that as the precise claim to fix, not the reporter's (often vaguer) symptom description. If the issue carries any follow-up bot comments (opening with "automated follow-up triage review"), check the most recent one too — it may have restated, sharpened, or only just written that statement, and its version of the claim supersedes the first-pass one. A statement that a later bot comment retracted no longer counts.
18+
19+
A `bug` label can arrive without that statement: the split and evidence gates (`/issue-triage` steps 1a and 1b) apply a type label and stop before any investigation. If no bot comment has a bug statement or a root-cause pointer, the fault hasn't been verified yet — don't fall back to the reporter's title or symptoms. Go to step 8 and say the issue needs a full triage (the follow-up review that the reporter's reply triggers) before a fix can be attempted.
1820

1921
## 2. Investigate
2022

‎.claude/skills/issue-triage-followup/SKILL.md‎

Lines changed: 8 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -50,11 +50,18 @@ Compare your updated understanding against the original triage comment's classif
5050
- If the classification, priority, or root-cause should change given the new information, update it. You may change or remove a label **you previously applied as the bot** (classification, priority, `waiting_for_user`) — never remove a label a human added.
5151
- Apply the same duplicate check as `/issue-triage` step 4 if the new information suggests one.
5252

53+
If the bot's most recent prior comment (the one you found in step 1) carries a one-line bug statement (`/issue-triage` step 3), that statement is a standing claim and this review must settle it rather than silently carry it forward or drop it — including when nothing material changed, one of:
54+
55+
- **Still a bug** — restate the one-line statement in this comment, unchanged if the new evidence doesn't bear on it, updated if it sharpens or changes what the fault actually is.
56+
- **Not a bug after all** — say so plainly, retract the statement, and give the corrected classification. This is the expected outcome when, as happened on #5390, a maintainer's own reply shows the reported behaviour is Predbat doing what the config says.
57+
58+
If this review concludes the issue is a bug and there is no live statement to restate — the bot's most recent prior comment has none, or retracted one — write the one-line statement now, to the same standard as `/issue-triage` step 3. That covers this review changing the classification **to** `bug` (for the first time, or back to `bug` after an earlier follow-up retracted the statement), and this review confirming a `bug` label that an early-exit gate (`/issue-triage` step 1a or 1b) applied without investigating — those gates stop before step 3, so the first full investigation after one is where the statement gets written, even though the label is already there. A statement in an older comment that a later one retracted is not live, so it never stands in for a new one.
59+
5360
## 5. Post one follow-up comment
5461

5562
Check the comment history first: if the most recent comment is already a bot comment with nothing from a human posted after it, stop — this review already happened and nothing new has arrived since.
5663

57-
Post exactly one comment via `gh issue comment <number> --body "..."`, opening with a line disclosing this is an automated follow-up triage review (a maintainer will review before any action is taken), followed by: what was new since the last review, whether the classification/priority/root-cause changed and why (or confirmation nothing changed), and any further information request.
64+
Post exactly one comment via `gh issue comment <number> --body "..."`, opening with a line disclosing this is an automated follow-up triage review (a maintainer will review before any action is taken), followed by: what was new since the last review, whether the classification/priority/root-cause changed and why (or confirmation nothing changed), the one-line bug statement from step 4 whenever one is restated, newly written, or retracted there — restated as-is if the new evidence didn't bear on it — and any further information request.
5865

5966
Do **not** touch the `BOT_TRIAGED` or `BOT_REVIEW` labels — the daemon manages both.
6067

‎.claude/skills/issue-triage/SKILL.md‎

Lines changed: 6 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -73,11 +73,13 @@ A `predbat_debug.yaml` can also be replayed against current main to reproduce th
7373

7474
Apply exactly one of: `bug`, `question`, `configuration` (user error/misconfiguration), `enhancement` (feature request). If genuinely ambiguous, apply `unclear` instead of guessing.
7575

76+
If you classify as `bug`, write a one-line statement of the bug in your own words — what Predbat actually does wrong, not the reporter's symptom description. State the faulty behaviour and, if you have one, the mechanism, e.g. "The dispatch-cancel check re-reads the car's live status instead of the status at cancel time, so a car that resumes charging a second later still loses its slot." A restatement of the title ("battery charging not working") is not acceptable. This line carries into step 9.
77+
7678
## 4. Check for duplicates
7779

7880
Search existing issues (`gh issue list --search ...`, both open and closed) for the same symptom.
7981

80-
- High confidence match: label `duplicate`, comment linking the original issue, and close this one.
82+
- High confidence match: label `duplicate`, comment linking the original issue (including the step 3 one-line bug statement, if you wrote one), and close this one.
8183
- Low confidence: mention "possibly related to #N" in your triage comment; don't close.
8284

8385
Then look for **similar** issues and PRs as well, whether or not they are duplicates: search both open and closed ones for the symptom, the integration and the component it touches (`gh issue list --state all --search ...` and `gh pr list --state all --search ...`). Read the findings in the best matches — what was diagnosed, what was fixed, and what was ruled out — before forming a hypothesis, and link the relevant ones in your triage comment as "related to #N". An issue that shares a symptom or a trigger is not necessarily the same problem: only call it a duplicate when the cause matches, not just the symptom, and treat a past finding as a lead to confirm against current main, not as a conclusion.
@@ -106,6 +108,7 @@ Then look for **similar** issues and PRs as well, whether or not they are duplic
106108

107109
- Form a root-cause hypothesis with a `file:line` pointer if the investigation supports one. It's fine to say the cause needs maintainer review if it doesn't.
108110
- You may edit files locally to test a hypothesis (e.g. a temporary debug print, a tweaked test fixture) — this clone is hard-reset and cleaned before the next run, so nothing here persists. Never `git commit` or `git push`.
111+
- If this investigation changes your mind about step 3's classification — e.g. you classified `bug` but the investigation shows Predbat is doing what the config says — go back and revise it, and drop or rewrite the one-line bug statement to match. Don't let step 9 post a statement step 3 wrote before you knew better.
109112

110113
## 6. Apply component labels
111114

@@ -131,6 +134,8 @@ Check existing comments first — if one from you is already there, stop; don't
131134

132135
Post exactly one comment via `gh issue comment <number> --body "..."`, opening with a line disclosing this is an automated first-pass triage (a maintainer will review before any action is taken), followed by: classification, priority (if set), what you investigated and found (including test result if you ran one), a root-cause pointer if you have one, and any information request.
133136

137+
If you reached step 3 and classified as `bug`, lead with the one-line bug statement immediately after the classification. Gates 1a/1b apply a type label without ever reaching step 3, so there's nothing to include if you took one of those paths.
138+
134139
After posting, apply the `BOT_TRIAGED` label via `gh issue edit <number> --add-label BOT_TRIAGED` — every triage run gets this label, including a duplicate-close, regardless of classification. It marks the issue as triaged for the separate PR-creation flow (see `.claude/skills/issue-pr/SKILL.md`).
135140

136141
## Guardrails

0 commit comments

Comments
 (0)