From dev-team
Investigates a bug hands-off, finds root cause, and writes a portable triage record with a TDD fix plan. Use when the user reports a bug and wants it triaged.
How this skill is triggered — by the user, by Claude, or both
Slash command
/dev-team:triage <bug description or error message> [--pdf]<bug description or error message> [--pdf]This skill is limited to the following tools:
The summary Claude sees in its skill listing — used to decide when to auto-load this skill
Role: worker.
Role: worker.
Investigate a bug hands-off, find root cause, and write a TDD fix plan to a
portable triage record at DEV_TEAM_REPORTS/triage/<slug>.md — no
issue-tracker dependency.
unconfirmed outcome instead.triage-record: line
plus a one-line root-cause summary — not the full body.Get the bug description from the arguments or conversation. If no description is
given, ask EXACTLY one question: What's the problem you're seeing? and stop.
If a description is given, ask nothing — start investigating immediately.
Scoped exception: if the description signals a cross-service or
intermittent symptom (it names multiple repos/services, or uses language like
"intermittent", "sometimes", or "inconsistently"), ask ONE additional targeted
question before investigating: Do you have any of the following: logs, a sample request/response pair, trace/audit IDs, or a config/pipeline export?
This is a narrow exception for that signal only — the "ask nothing" rule above
still applies to every other description, and the no-description fallback
question above is unchanged.
Arguments: $ARGUMENTS
Apply the systematic debugging protocol from skills/systematic-debugging/SKILL.md:
Use the Agent tool with subagent_type: "Explore" to deeply investigate the codebase:
related source files and dependencies, existing tests (covered vs missing),
recent changes to affected files (git log), error handling in the code path,
and similar patterns elsewhere that work correctly.
Boundary dead-end: if static tracing (grep/codegraph_explore) returns
zero hits for the relevant identifiers across all checked-out repos, name this
explicitly as "producer not located in scope" — do not keep searching
until an unrelated bug-shaped pattern turns up nearby. Carry this named
outcome into the Verification Checkpoint (Step 4), which routes it to the
unconfirmed outcome.
Create an ordered list of RED-GREEN cycles, each a vertical slice:
Tests verify behavior at the public interface, not implementation details.
Hard gate — cannot be skipped implicitly. Before writing a confirmed
record, state in one sentence what concrete evidence (a log line, a
reproduced failure, an observed value in the actual data path) ties the
hypothesized cause to the reported symptom. A boundary dead-end from Step 2
("producer not located in scope") counts as inadequate evidence.
If that evidence exists, proceed to Step 5 with confidence: confirmed.
If it does not, do not write a confirmed root-cause section — route to the
unconfirmed outcome in Step 5 instead. There is no silent pass-through: a
missing or hand-waved evidence statement means unconfirmed, not confirmed.
Resolve the slug from the bug title/description with this 8-step algorithm:
[a-z0-9-].triage-YYYYMMDD (today's UTC date).Resolve collisions: if DEV_TEAM_REPORTS/triage/<slug>.md exists, append
-2, -3, … up to -99 until a free name is found. Never overwrite an
existing record.
Write the file: (see knowledge/report-output-location.md for the
shared DEV_TEAM_REPORTS/ convention this follows)
mkdir -p DEV_TEAM_REPORTS/triage/
If DEV_TEAM_REPORTS/triage/ cannot be created or written (permission/read-only):
report Cannot write DEV_TEAM_REPORTS/triage/<slug>.md: <error>, write the
same content to a temp file (tmp/triage-<slug>.md or $TMPDIR), and print
the full record content to chat so nothing is lost.
When --pdf was passed and the record was written to disk, render that
resolved path (the exact <slug> chosen after collision resolution) to a
sibling PDF per knowledge/report-pdf-integration.md (additive; non-fatal if
no engine):
sh "$CLAUDE_PLUGIN_ROOT/hooks/py.sh" "$CLAUDE_PLUGIN_ROOT/hooks/lib/report_pdf.py" DEV_TEAM_REPORTS/triage/<resolved-slug>.md
The record is YAML frontmatter followed by four sections. Three outcomes are possible, and they are mutually distinct — not variants of one another:
confirmed — the Verification Checkpoint (Step 4) found concrete
evidence tying the cause to the reported symptom. Full Root Cause Analysis
and TDD Fix Plan, no banner.unconfirmed — a contributing factor was identified, but the
checkpoint found no evidence linking it to the reported symptom (including
a Step 2 boundary dead-end). Banner required; fix plan reframed as
addressing the contributing factor, not the confirmed cause.## TDD Fix Plan
is replaced with the fixed string below; there is no confidence field
distinction because there is nothing to mark as confirmed or unconfirmed.---
id: <resolved-slug>
created: <YYYY-MM-DDThh:mm:ssZ>
status: open
confidence: confirmed
---
# <concise bug title>
## Problem
- **Actual behavior**: [what happens]
- **Expected behavior**: [what should happen]
- **Reproduction**: [how to trigger it]
## Root Cause Analysis
[What code path is involved, why it fails, contributing factors. Describe
modules and behaviors, not file paths — the record should survive refactors.]
## TDD Fix Plan
1. **RED**: Write a test that [expected behavior]
**GREEN**: [Minimal change to pass]
2. **RED**: Write a test that [next behavior]
**GREEN**: [Minimal change to pass]
**REFACTOR**: [Any cleanup after all tests pass]
## Acceptance Criteria
- [ ] Root cause is addressed (not just symptom)
- [ ] All new tests pass
- [ ] Existing tests still pass
- [ ] No regressions introduced
confidence field: omitted/absent defaults to confirmed — no migration
needed for historical triage records predating this schema. Set
confidence: unconfirmed
when the Verification Checkpoint routed here without evidence. When
unconfirmed, ## Root Cause Analysis must open with:
> **UNCONFIRMED** — contributing factor identified; not verified against the reported symptom.
and ## TDD Fix Plan must explicitly frame the plan as addressing "the
identified contributing factor," not the confirmed root cause.
At least one RED/GREEN cycle is required. If no root cause was determined,
the entire ## TDD Fix Plan body is exactly:
Root cause not determined — manual investigation required
Print exactly two lines:
triage-record: DEV_TEAM_REPORTS/triage/<resolved-slug>.md (the actual resolved path)Do not repeat the full record body in chat.
npx claudepluginhub bdfinst/agentic-dev-team --plugin dev-teamTriages bugs or issues by exploring codebase for root cause, then creates GitHub issue with TDD fix plan. Use for bug reports, triage requests, or fix planning.
Turns raw bug reports into groomed, fixable tasks with reproducers, expected-vs-actual, and regression-test acceptance criteria. Use when a bug report lacks detail or a flaky test needs a proper task.
Fast bug fixes with root cause investigation + TDD. Enforces 'no fix without root cause' discipline and verification protocol. Without this skill, fixes are applied at symptoms instead of sources, and bugs return.