Bulk triage and reproduce multiple SkiaSharp GitHub issues in a single command. Orchestrates parallel triage agents then serial reproduction agents, and presents a consolidated summary. Triggers: "bulk process issues", "triage and repro these issues", "process issues 3400 3428 3429", "process the newest 10 issues", "bulk triage", "batch process issues", any request to triage or reproduce multiple issues at once.
Orchestrate bulk triage and reproduction of multiple SkiaSharp issues by delegating to
issue-triage and issue-repro skills via sub-agents.
Parse the user's message to determine the issue list:
#, or numbers in a space/comma-separated list that the user
clearly intends as issue numbers (e.g., #3400 #3428, issues 3400, 3428, 3429, triage 123 456 789).
Issue numbers may be 2–5 digits.ask_user tool.gh repo view --json owner,name -q '"\(.owner.login)/\(.name)"'
Store the {owner} and {repo} for use in all subsequent phases.
Use the gh CLI for all issue lookups. It handles pagination automatically via the -L (limit) flag —
no manual page iteration needed.
If explicit numbers given: Use them directly — they refer to the current repository.
If "newest N issues" or similar:
gh issue list --state open -L {N} --json number,title -q '.[] | "\(.number)\t\(.title)"'
If search query (e.g., "all blazor issues", "issues about WASM", "label:area/foo"):
gh issue list -S "{search terms}" --state open -L 500 --json number,title -q '.[] | "\(.number)\t\(.title)"'
For label-based queries, use --label instead of -S:
gh issue list --label "area/SkiaSharp.Views" --state open -L 500 --json number,title -q '.[] | "\(.number)\t\(.title)"'
Note:
-L 500is a generous upper bound.ghfetches exactly as many pages as needed and stops when results are exhausted, so over-specifying the limit is fine.
Extract issue numbers from the output. Present the list to the user and confirm before proceeding.
Before launching triage/repro agents, check for existing result files:
# Check for existing triage results
ls .data-cache/repos/{owner}-{repo}/ai-triage/{number}.json 2>/dev/null
# Check for existing repro results
ls .data-cache/repos/{owner}-{repo}/ai-repro/{number}.json 2>/dev/null
Found 33 issues. 15 already triaged, 12 already reproduced.
Will triage: 18 | Will reproduce: 21
Triage is read-only — safe to parallelize.
Launch one general-purpose background agent per issue. Each agent's prompt is exactly:
triage issue {number}
This triggers the issue-triage skill in each agent.
Steps:
mode: "background" via the task tool. Collect all returned agent_id values.read_agent for each agent_id with wait: true, timeout: 300. You can call multiple read_agent in parallel.read_agent again with another 300s timeout (600s total max).Type: type/bug (0.95), Severity: high, Action: needs-investigation in the response text.issue-triage or ai-triage, it failed to invoke the skill — report it.Batch size limit: Launch at most 12 agents at once. If more issues, wait for the current batch to complete before launching the next.
Reproduction may build projects, create files, open simulators — must run in series.
Launch one general-purpose sync agent per issue, sequentially. Each agent's prompt is exactly:
reproduce issue #{number}
This triggers the issue-repro skill in each agent.
Steps:
task agent with mode: "sync". The call blocks until the agent completes.reproduced, not-reproduced, needs-platform,
needs-hardware, inconclusive, partial). Look for Conclusion: in the response text.Present a consolidated summary table using data extracted from the agent responses in Phases 2 and 3:
## Bulk Process Results
| # | Issue | Type | Severity | Triage Action | Repro Conclusion |
|---|-------|------|----------|---------------|------------------|
| 1 | #3400 | Bug | medium | needs-investigation | ⏭️ needs-platform |
| 2 | #3472 | Bug | medium | needs-investigation | ❌ reproduced |
...
### Stats
- Triaged: {N}
- Reproduced: {reproduced}
- Not reproduced: {not_reproduced}
- Blocked (needs-platform/hardware): {blocked}
- Inconclusive: {inconclusive}
Conclusion icons: ❌ reproduced · ✅ not-reproduced · ⏭️ needs-platform/hardware · ❓ inconclusive · ⏱️ timeout · ⏩ skipped (already processed)
| Situation | Action |
|---|---|
| Agent times out after 600s total | Record as ⏱️ timeout in the summary and continue |
| Agent response doesn't mention the skill | Record as failed in the summary and continue |
| GitHub API fails for "newest N" | Ask user to provide explicit issue numbers |