src/autoskillit/skills_extended/triage-issues/SKILL.md
Analyze open GitHub issues and produce a sequenced implementation plan — grouping issues into parallel batches, ordering those batches, and tagging each issue with its recipe route. Use when user says "triage issues", "prioritize issues", or "plan issue order".
npx skillsauth add talont-org/autoskillit triage-issuesInstall this skill globally with one command. Works with Claude Code, Cursor, and Windsurf.
3 of 9 scanners reported clean
Some scanners were skipped, did not run, or reported a non-clean status. Review each row below.
Analyze open GitHub issues, classify each into a recipe route, group them into parallel implementation batches, and produce a structured triage report.
NEVER:
--no-label is passed{{AUTOSKILLIT_TEMP}}/triage-issues/ directory--body shell substitution (--body "$(...)) for gh issue edit — always write to
{{AUTOSKILLIT_TEMP}}/triage-issues/edit_body_{timestamp}.md and use --body-filerun_in_background: true is prohibited)ALWAYS:
model: "sonnet" when spawning all subagents via the Task tool{{AUTOSKILLIT_TEMP}}/triage-issues/ (relative to the current working directory)gh CLI for all GitHub operations (not raw API calls)Parse optional arguments from the user's invocation:
--batch-size N — maximum issues per batch (default: 4)--no-label — skip GitHub label application after triage--dry-run — run analysis but skip label application even if --no-label is not set--collapse — invoke collapse-issues after split analysis to consolidate related issues--enrich — for each issue classified as recipe:implementation, generate and append
structured requirements (REQ-{GRP}-NNN format) to the issue body.
Skips issues that already have a ## Requirements section (idempotent).
No effect on recipe:remediation issues.# Verify GitHub authentication
gh auth status
# Fetch all open issues with required fields, excluding in-progress issues
gh issue list --state open --json number,title,body,labels,url,assignees --limit 200 \
| jq '[.[] | select(.labels | map(.name) | contains(["in-progress"]) | not)]'
Issues carrying the in-progress label are actively being processed by a pipeline session
and are excluded from triage to prevent duplicate work.
If gh auth status fails, abort with a clear error message.
If there are zero open issues (after filtering), skip to Step 7 and output an empty report.
Before codebase analysis, run issue-splitter for every open issue to detect mixed-concern issues and expand the working set.
Launch up to 8 subagents in parallel (model: "sonnet"), one per issue. Each subagent invokes:
/autoskillit:issue-splitter --issue {N} --repo {owner/repo} [--no-label if --no-label was passed] [--dry-run if --dry-run was passed]
For each subagent result, parse the ---issue-splitter-result--- block and build the expanded working set:
decision=no-split: keep the original issue in the working set; note the pre-classified route as a seed for Step 3 (Recipe Classification) — Step 3 still re-verifiesdecision=split: remove the original issue from the working set; add its sub_issues list insteaddecision=error: log a warning; keep the original issue as-is (fail-safe)Proceed to Step 2c (if --collapse) or Step 2b with the expanded working set.
Flag propagation: When triage-issues is invoked with --no-label, pass --no-label to each issue-splitter call. When --dry-run is active, pass --dry-run. This ensures split analysis is observable without mutating GitHub.
If --collapse was passed:
Invoke the collapse-issues skill to consolidate related issues before analysis:
/autoskillit:collapse-issues --repo {owner/repo} [--dry-run if --dry-run was passed] [--no-label if --no-label was passed]
Parse the ---collapse-issues-result--- block from the skill output:
groups_formed: log "Collapsed N groups ({M} issues → {groups_formed} combined issues)"Flag propagation: --dry-run and --no-label are passed through to collapse-issues.
The collapse step runs after splitting is complete so it sees the fully-decomposed issue list.
Launch parallel subagents (up to 8) to analyze each issue. Each subagent receives one issue and must identify:
recipe/, server/, execution/)#N) or inferred dependencies from content overlapUse model: "sonnet" for all subagents.
Priority signal — Validated Audit Report:
If the issue title contains "Validated Audit Report" (the exact prefix set by prepare-issue
when creating an issue from a validated audit output), classify as recipe:implementation
with high confidence. Do NOT allow issue scope (number of findings / large scope) to override
this signal — a 40-finding audit is structural quality improvement work, not broken behavior.
Skip the "Is existing behavior broken?" analysis for these issues.
Classify each issue into a recipe route using the primary behavioral criterion — is existing behavior broken?
Is existing behavior broken?
recipe:remediationrecipe:implementationThe key distinction is broken vs. missing:
Examples that route to remediation:
Examples that route to implementation:
Common misclassification: "the orchestrator did the wrong thing"
When an LLM orchestrator bypasses routing, retries instead of escalating, or ignores a failure — that is almost always a gap (missing guardrail, missing discipline rule), not a runtime error. The orchestrator didn't crash; it made an unguarded choice. Route to implementation unless the orchestrator hit an actual exception.
For each issue, record:
implementation or remediation)high or low)For each issue where you cannot confidently assign a recipe route, you MUST pause and present it to the user. Do NOT silently guess.
Present each ambiguous issue as follows:
Ambiguous Issue: #{number} — "{title}"
Summary: {1-2 sentence summary of what the issue asks for}
Conflicting Signals:
implementation: {reason}remediation: {reason}Decision needed: Route to implementation or remediation? (Or type "skip" to exclude)
Open questions that would change routing:
Wait for the user's response before continuing to the next ambiguous issue. Record all human decisions for inclusion in the triage report.
--enrich is passed)For each issue in the working set classified as recipe:implementation:
gh issue view {N} --json body -q .body
## Requirements section already present in the body: skip (idempotent).**REQ-{GRP}-NNN:** {single-sentence condition statement}.--dry-run or --no-label is active: print generated requirements to stdout
per issue but skip gh issue edit. Record requirements_generated: true in manifest.ts=$(date +%Y-%m-%d_%H%M%S)
EDIT_BODY_FILE="{{AUTOSKILLIT_TEMP}}/triage-issues/edit_body_${ts}.md"
REQUIREMENTS_FILE="{{AUTOSKILLIT_TEMP}}/triage-issues/requirements_${ts}.md"
mkdir -p "{{AUTOSKILLIT_TEMP}}/triage-issues"
# Fetch current body to temp file (avoids shell interpolation):
gh issue view {N} --json body -q .body > "${EDIT_BODY_FILE}"
# Populate ${REQUIREMENTS_FILE} with the generated requirements content, then:
printf '\n\n## Requirements\n\n' >> "${EDIT_BODY_FILE}"
cat "${REQUIREMENTS_FILE}" >> "${EDIT_BODY_FILE}"
gh issue edit {N} --body-file "${EDIT_BODY_FILE}"
requirements_generated: false in the manifest for that issue.This step is in-context only — no subagents are spawned for enrichment.
recipe:remediation issues are not enriched regardless of the --enrich flag.
Build a conflict graph where:
Issues that touch completely independent systems have no edges and can safely run in parallel.
Partition issues into batches of at most batch_size using a greedy graph-coloring approach:
Order the batches for sequential execution:
priority:high issues come earlier (tiebreaker)Compute timestamp: YYYY-MM-DD_HHMMSS.
Ensure {{AUTOSKILLIT_TEMP}}/triage-issues/ exists.
7a. Triage report: {{AUTOSKILLIT_TEMP}}/triage-issues/triage_report_{ts}.md
The report contains:
7b. Machine-readable manifest: {{AUTOSKILLIT_TEMP}}/triage-issues/triage_manifest_{ts}.json
{
"generated_at": "{ISO timestamp}",
"batch_size": 4,
"total_issues": 12,
"batch_count": 3,
"recipe_distribution": {"implementation": 8, "remediation": 4},
"batches": [
{
"batch": 1,
"priority": "first",
"issues": [
{
"number": 42,
"title": "Add user auth",
"recipe": "implementation",
"confidence": "high",
"systems": ["auth", "api"],
"rationale": "Well-defined feature with clear acceptance criteria",
"requirements_generated": true
}
]
}
],
"skipped_issues": [],
"human_decisions": [
{"number": 55, "decision": "remediation", "reason": "User chose investigation-first"}
]
}
Issues not enriched (recipe:remediation, or --enrich not passed) emit "requirements_generated": null.
7c. Label application (unless --no-label is passed):
Ensure recipe labels exist (idempotent):
gh label create "recipe:implementation" --description "Route through implementation recipe" --color "0E8A16" --force
gh label create "recipe:remediation" --description "Route through remediation recipe" --color "D93F0B" --force
For each triaged issue, apply its recipe label:
gh issue edit {number} --add-label "recipe:{recipe}"
sleep 1 # Rate-limit discipline: 1s between mutating calls
{{AUTOSKILLIT_TEMP}}/triage-issues/
triage_report_{ts}.md # Human-readable triage report
triage_manifest_{ts}.json # Machine-readable manifest for downstream pipelines
After the triage report and manifest are written, emit the following structured output tokens as the very last lines of your text output:
IMPORTANT: Emit the structured output tokens as literal plain text with no markdown formatting on the token names. Do not wrap token names in
**bold**,*italic*, or any other markdown. The adjudicator performs a regex match on the exact token name — decorators cause match failure.
triage_report = {absolute_path_to_report_file}
triage_manifest = {absolute_path_to_manifest_file}
total_issues = {integer_count}
batch_count = {integer_count}
recipe_distribution = {json_distribution_dict}
These emit lines are consumed by capture: in orchestrating recipes. The
triage_manifest path is the primary output used by downstream recipe steps.
Example emit block:
triage_report = {{AUTOSKILLIT_TEMP}}/triage-issues/triage_report_20260310_120000.md
triage_manifest = {{AUTOSKILLIT_TEMP}}/triage-issues/triage_manifest_20260310_120000.json
total_issues = 12
batch_count = 3
recipe_distribution = {"implementation": 8, "remediation": 4}
/autoskillit:analyze-prs — Similar batch analysis pattern, but for PRs instead of issues/autoskillit:make-groups — Groups requirements for planning; triage-issues groups issues for execution/autoskillit:investigate — Can be used to deep-dive individual issues before triagedevelopment
Generate YAML recipes for .autoskillit/recipes/. Use when user says "make script skill", "generate script", "script a workflow", "write a script", "create a script", "new recipe", "write a pipeline", or when loaded by other skills for script formatting.
data-ai
Create Uncertainty Representation visualization planning spec showing error bar definitions, distribution-aware alternatives, and multi-seed variance protocols. Statistical lens answering "How is uncertainty honestly represented?"
data-ai
Create Temporal Dynamics visualization planning spec showing axis scaling (linear vs log), smoothing disclosure, epoch/step alignment, run aggregation (mean + variance bands), early-stopping markers, and wall-clock vs step-count x-axis. Temporal lens answering "Are training dynamics shown clearly and honestly?"
data-ai
Create Narrative Story Arc visualization planning spec showing visual consistency across the report (same color = same model everywhere), logical figure progression, redundant figure detection, and narrative dependency between figures. Narrative lens answering "Do the figures tell a coherent story across the report?"