Agent skill
auto-solve-issue
Complete issue lifecycle with Task dependencies and Subagents - true zero-pause automation. TRIGGER when: user wants fully automated issue resolution ("auto-solve issue #N", "solve issue completely"). DO NOT TRIGGER when: user wants manual control (use /work-issue --interactive), or individual phases (use specific skills).
Install this agent skill to your Project
npx add-skill https://github.com/majiayu000/claude-skill-registry/tree/main/skills/other/other/auto-solve-issue
SKILL.md
Auto-Solve Issue v2.0 - Zero-Pause Automation
Complete issue lifecycle using Task dependencies + Subagents architecture for truly continuous execution
Overview
This skill provides fully automated issue resolution without manual intervention:
What it does:
- Creates Task dependency chain - 5 tasks with blockedBy relationships
- Executes phases with Subagents - Each phase runs in isolated context
- Validates at checkpoints - Auto-continues if score ≥ 90
- Resumes from failures - Checkpoint and resume mechanism
- Zero manual intervention - Continuous loop until completion
Why it's needed: solve-issue v1.0 had execution pauses requiring manual "continue" 3-4 times. The Python coordinator + AI executor architecture was incompatible with AI interaction patterns. This v2.0 uses Claude Code's Task system and Subagents for true zero-pause automation.
When to use:
- Need complete automation without checkpoints
- Issue is well-defined with high confidence
- Trust validation scores (eval-plan, review)
Workflow:
/auto-solve-issue #23 [--auto|--interactive]
→ Creates 5 tasks with dependencies
→ Phase 1: start-issue (Subagent)
→ Phase 1.5: eval-plan + checkpoint
→ Phase 2: execute-plan (Subagent)
→ Phase 2.5: review + checkpoint
→ Phase 3: finish-issue (Subagent)
→ All complete
Arguments
/auto-solve-issue [issue-number] [options]
Common usage:
/auto-solve-issue #23 # Auto mode (score-based checkpoints)
/auto-solve-issue #23 --interactive # Stop at all checkpoints
/auto-solve-issue #23 --resume # Resume from saved state
Options:
[issue-number]- Required, which issue to solve--auto- Auto mode (default) - continues if score ≥ 90--interactive- Stop at checkpoints for manual review--resume- Resume from last checkpoint
AI Execution Instructions
CRITICAL: Task dependencies + Subagent execution pattern
When executing /auto-solve-issue, AI MUST follow this pattern:
Step 1: Create 5-Task Dependency Chain
# Create 5 tasks representing the workflow phases
# Each task includes metadata for checkpoints and phase tracking
# Phase 1: Start Issue
task1 = TaskCreate(
subject="Phase 1: start-issue",
description="Create branch, generate plan, sync with main",
activeForm="Creating branch and plan",
metadata={
"phase": "1",
"skill": "start-issue",
"checkpoint": False,
"issue_number": issue_number
}
)
# Phase 1.5: Evaluate Plan (with checkpoint)
task2 = TaskCreate(
subject="Phase 1.5: eval-plan",
description="Validate implementation plan (score must be ≥ 90 for auto-continue)",
activeForm="Evaluating plan",
metadata={
"phase": "1.5",
"skill": "eval-plan",
"checkpoint": True,
"checkpoint_name": "Checkpoint 1",
"score_threshold": 90,
"issue_number": issue_number
}
)
# Block Phase 1.5 until Phase 1 completes
TaskUpdate(task2.id, addBlockedBy=[task1.id])
# Phase 2: Execute Plan
task3 = TaskCreate(
subject="Phase 2: execute-plan",
description="Implement all tasks from plan",
activeForm="Executing implementation plan",
metadata={
"phase": "2",
"skill": "execute-plan",
"checkpoint": False,
"issue_number": issue_number
}
)
# Block Phase 2 until Phase 1.5 completes (including checkpoint)
TaskUpdate(task3.id, addBlockedBy=[task2.id])
# Phase 2.5: Review Code (with checkpoint)
task4 = TaskCreate(
subject="Phase 2.5: review",
description="Validate code quality (score must be ≥ 90 for auto-continue)",
activeForm="Reviewing code quality",
metadata={
"phase": "2.5",
"skill": "review",
"checkpoint": True,
"checkpoint_name": "Checkpoint 2",
"score_threshold": 90,
"issue_number": issue_number
}
)
# Block Phase 2.5 until Phase 2 completes
TaskUpdate(task4.id, addBlockedBy=[task3.id])
# Phase 3: Finish Issue
task5 = TaskCreate(
subject="Phase 3: finish-issue",
description="Commit, create PR, merge, close issue",
activeForm="Finishing issue",
metadata={
"phase": "3",
"skill": "finish-issue",
"checkpoint": False,
"issue_number": issue_number
}
)
# Block Phase 3 until Phase 2.5 completes (including checkpoint)
TaskUpdate(task5.id, addBlockedBy=[task4.id])
# Store task IDs for main loop
task_ids = [task1.id, task2.id, task3.id, task4.id, task5.id]
Key Design Decisions:
- Dependency Chain: Each task blocks the next, creating a sequential workflow
- Metadata: Stores phase number, skill name, checkpoint flag, score threshold
- Checkpoints: Phases 1.5 and 2.5 are checkpoints with score validation
- Auto-unlock: When a task completes, the next task automatically becomes available
Step 2: Find Next Available Task
def find_next_available_task(task_ids: list[str]) -> dict | None:
"""
查找下一个可用任务(pending 且无 blockedBy 的任务)
Args:
task_ids: 所有工作流任务的 ID 列表
Returns:
下一个可用任务的详细信息,如果没有则返回 None
返回格式: {
"id": str,
"subject": str,
"status": str,
"metadata": dict,
"blockedBy": list
}
"""
# 获取所有任务的当前状态
all_tasks = TaskList()
# 过滤出我们创建的工作流任务
workflow_tasks = [t for t in all_tasks if t.id in task_ids]
# 查找第一个 pending 且无 blockedBy 的任务
for task in workflow_tasks:
# 跳过已完成的任务
if task.status == "completed":
continue
# 跳过有阻塞依赖的任务
if task.blockedBy and len(task.blockedBy) > 0:
# 检查是否所有阻塞任务都已完成
all_blockers_done = True
for blocker_id in task.blockedBy:
blocker = next((t for t in workflow_tasks if t.id == blocker_id), None)
if blocker and blocker.status != "completed":
all_blockers_done = False
break
# 如果还有未完成的阻塞任务,跳过
if not all_blockers_done:
continue
# 找到了下一个可用任务
return {
"id": task.id,
"subject": task.subject,
"status": task.status,
"metadata": task.metadata,
"blockedBy": task.blockedBy
}
# 没有找到可用任务
return None
Logic Explanation:
- Get current state: Use TaskList() to fetch all tasks
- Filter workflow tasks: Only consider our 5 created tasks
- Find available task:
- Status must be "pending" (not "completed")
- No blockedBy dependencies, OR all blockers are completed
- Return first match: The task that's ready to execute
Edge Cases:
- All tasks completed → return None (workflow done)
- Tasks still blocked → return None (wait for blocker to complete)
- Task in_progress → skip it (shouldn't happen in normal flow)
Step 3: Execute with Subagent
def execute_with_subagent(task: dict, mode: str) -> dict:
"""
使用 Subagent 执行指定的 skill
Args:
task: 任务详细信息(包含 metadata 中的 skill 名称)
mode: 执行模式 ("auto" 或 "interactive")
Returns:
执行结果 {
"success": bool,
"score": int | None, # For checkpoint phases
"error": str | None
}
"""
skill_name = task["metadata"]["skill"]
issue_number = task["metadata"]["issue_number"]
is_checkpoint = task["metadata"].get("checkpoint", False)
# 构建 skill 参数
if skill_name == "eval-plan":
skill_args = f"{issue_number} --mode={mode}"
elif skill_name == "review":
skill_args = "" # review 自动检测当前分支
elif skill_name in ["start-issue", "execute-plan", "finish-issue"]:
skill_args = str(issue_number)
else:
skill_args = str(issue_number)
# 启动 Subagent 执行 skill
try:
# 使用 Task tool 启动 subagent
result = Task(
subagent_type="general-purpose",
description=f"Execute {skill_name}",
prompt=f"Execute /{skill_name} {skill_args}",
model="sonnet", # 使用 sonnet 确保质量
max_turns=30 # 60 minutes timeout (2 min per turn)
)
# 如果是 checkpoint phase,读取 score
score = None
if is_checkpoint:
if skill_name == "eval-plan":
score = read_eval_plan_score()
elif skill_name == "review":
score = read_review_score()
return {
"success": True,
"score": score,
"error": None
}
except Exception as e:
# Subagent 执行失败
return {
"success": False,
"score": None,
"error": str(e)
}
def read_eval_plan_score() -> int | None:
"""从 .claude/.eval-plan-status.json 读取分数"""
try:
status_file = ".claude/.eval-plan-status.json"
with open(status_file, "r") as f:
data = json.load(f)
return data.get("score")
except:
return None
def read_review_score() -> int | None:
"""从 .claude/.review-status.json 读取分数"""
try:
status_file = ".claude/.review-status.json"
with open(status_file, "r") as f:
data = json.load(f)
return data.get("score")
except:
return None
Key Design Points:
-
Subagent Isolation: Each phase runs in independent context
- No context pollution between phases
- Clean execution environment
- Separate error handling
-
Skill Arguments: Customize args per skill
- eval-plan: Needs --mode=auto/interactive
- review: Auto-detects current branch
- Others: Just need issue number
-
Timeout: max_turns=30 = ~60 minutes per phase
- Prevents infinite loops
- Allows complex phases to complete
- Can be adjusted based on testing
-
Score Reading: For checkpoint phases
- eval-plan writes .eval-plan-status.json
- review writes .review-status.json
- Read after subagent completes
-
Error Handling: Return structured result
- success flag indicates completion
- score extracted for checkpoints
- error message captured
Step 4: Main Execution Loop
# Check if resuming from previous run
if resume_flag:
resume_data = load_resume_point()
if resume_data:
# Resume workflow from saved state
context = resume_workflow(resume_data)
task_ids = context["task_ids"]
mode = context["mode"]
issue_number = context["issue_number"]
else:
print("⚠️ No resume point found, starting fresh")
# Continue with fresh start (task_ids already created)
else:
# Fresh start - task_ids already created in Step 1
pass
# Main workflow loop - continues until all phases complete
while True:
# 1. Find next available task
next_task = find_next_available_task(task_ids)
# 2. Check if workflow complete
if next_task is None:
# All tasks completed
print("✅ All phases completed!")
cleanup_state_files()
break
# 3. Display current phase
phase = next_task["metadata"]["phase"]
skill = next_task["metadata"]["skill"]
is_checkpoint = next_task["metadata"].get("checkpoint", False)
print(f"\n📋 Executing Phase {phase}: {skill}")
# 4. Mark task as in_progress
TaskUpdate(next_task["id"], status="in_progress")
# 5. Execute with subagent
result = execute_with_subagent(next_task, mode)
# 6. Check execution result
if not result["success"]:
# Execution failed
print(f"❌ Phase {phase} failed: {result['error']}")
# Increment retry count
retry_count = next_task["metadata"].get("retry_count", 0)
retry_count += 1
if retry_count >= 3:
# Max retries exceeded
print(f"❌ Max retries (3) exceeded for Phase {phase}")
save_resume_point(next_task["id"], "max_retries_exceeded")
break
else:
# Retry
print(f"⚠️ Retrying Phase {phase} (attempt {retry_count + 1}/3)")
TaskUpdate(
next_task["id"],
status="pending",
metadata={"retry_count": retry_count}
)
continue
# 7. Handle checkpoint phases
if is_checkpoint:
score = result["score"]
threshold = next_task["metadata"]["score_threshold"]
checkpoint_name = next_task["metadata"]["checkpoint_name"]
print(f"\n⏸️ {checkpoint_name}")
print(f" Score: {score}/100")
print(f" Threshold: {threshold}")
if score is None:
# Score not available
print(f"⚠️ Score not available, treating as checkpoint")
if mode == "auto":
# Auto mode requires score
save_resume_point(next_task["id"], "score_unavailable")
print(f"⏸️ Stopping - fix issue and use --resume")
break
else:
# Interactive mode - ask user
user_decision = ask_user_to_continue()
if user_decision != "continue":
save_resume_point(next_task["id"], "user_stopped")
break
elif score < threshold:
# Score below threshold
print(f"⚠️ Score {score} < {threshold}")
if mode == "auto":
# Auto mode stops on low score
save_resume_point(next_task["id"], "score_below_threshold")
print(f"\n⏸️ Stopping at {checkpoint_name}")
print(f" Score {score}/100 is below threshold {threshold}")
print(f" Fix issues and resume: /auto-solve-issue #{issue_number} --resume")
break
else:
# Interactive mode - ask user
user_decision = ask_user_to_continue()
if user_decision != "continue":
save_resume_point(next_task["id"], "user_stopped")
break
else:
# Score ≥ threshold
print(f"✅ Score {score} ≥ {threshold} - auto-continuing")
# 8. Mark task as completed
TaskUpdate(next_task["id"], status="completed")
print(f"✅ Phase {phase} completed")
# Workflow complete or stopped
if next_task is None:
print("\n🎉 Issue lifecycle complete!")
print(f" Issue #{issue_number} resolved")
print(f" All phases executed successfully")
else:
print(f"\n⏸️ Workflow paused at Phase {phase}")
print(f" Resume with: /auto-solve-issue #{issue_number} --resume")
Loop Flow:
- Find next task: Check which task is ready (pending + no blockers)
- Completion check: If none found, all tasks are done
- Display phase: Show current phase to user
- Mark in progress: Update task status
- Execute subagent: Run the skill in isolated context
- Error handling: Retry up to 3 times, then save resume point
- Checkpoint logic:
- Auto mode: Stop if score < 90
- Interactive mode: Always ask user
- Continue if score ≥ 90
- Mark completed: Task done, dependency automatically unlocks next task
Key Features:
- Continuous execution: Loop continues until all tasks done or checkpoint stops
- Auto-unlock: Completing a task automatically unblocks the next
- Retry logic: Failed phases retry up to 3 times
- Checkpoint validation: Score-based decision in auto mode
- Resume points: Save state when stopping for resume later
Step 5: Checkpoint Checks
def check_checkpoint(checkpoint_name: str, mode: str) -> dict:
"""
检查 checkpoint 分数并决定是否继续
Args:
checkpoint_name: "Checkpoint 1" (eval-plan) 或 "Checkpoint 2" (review)
mode: "auto" 或 "interactive"
Returns:
{
"should_continue": bool,
"score": int | None,
"reason": str
}
"""
# 根据 checkpoint 名称读取相应的状态文件
if checkpoint_name == "Checkpoint 1":
status_file = ".claude/.eval-plan-status.json"
skill_name = "eval-plan"
elif checkpoint_name == "Checkpoint 2":
status_file = ".claude/.review-status.json"
skill_name = "review"
else:
return {
"should_continue": False,
"score": None,
"reason": f"Unknown checkpoint: {checkpoint_name}"
}
# 读取状态文件
try:
with open(status_file, "r") as f:
data = json.load(f)
score = data.get("score")
status = data.get("status")
# 验证 valid_until 时间戳(状态文件有效期 90 分钟)
valid_until = data.get("valid_until")
if valid_until:
from datetime import datetime
valid_time = datetime.fromisoformat(valid_until)
now = datetime.now()
if now > valid_time:
return {
"should_continue": False,
"score": score,
"reason": f"{skill_name} status expired - re-run {skill_name}"
}
except FileNotFoundError:
return {
"should_continue": False,
"score": None,
"reason": f"Status file not found: {status_file}"
}
except json.JSONDecodeError:
return {
"should_continue": False,
"score": None,
"reason": f"Invalid JSON in {status_file}"
}
# 判断是否继续
threshold = 90
if score is None:
# 分数不可用
if mode == "auto":
return {
"should_continue": False,
"score": None,
"reason": "Score unavailable in auto mode"
}
else:
# Interactive mode - 让用户决定
return {
"should_continue": ask_user_to_continue() == "continue",
"score": None,
"reason": "User decision (score unavailable)"
}
elif score < threshold:
# 分数低于阈值
if mode == "auto":
return {
"should_continue": False,
"score": score,
"reason": f"Score {score} < {threshold} (auto mode)"
}
else:
# Interactive mode - 让用户决定
return {
"should_continue": ask_user_to_continue() == "continue",
"score": score,
"reason": f"User decision (score {score} < {threshold})"
}
else:
# 分数 >= 阈值
return {
"should_continue": True,
"score": score,
"reason": f"Score {score} ≥ {threshold}"
}
def ask_user_to_continue() -> str:
"""
在 interactive mode 下询问用户是否继续
Returns:
"continue" 或 "stop"
"""
# 使用 AskUserQuestion tool
response = AskUserQuestion(
questions=[{
"question": "Continue to next phase?",
"header": "Checkpoint",
"options": [
{
"label": "Continue",
"description": "Proceed to next phase despite issues"
},
{
"label": "Stop",
"description": "Pause workflow to fix issues"
}
],
"multiSelect": False
}]
)
# Parse response
if "Continue" in response.values():
return "continue"
else:
return "stop"
Checkpoint Logic:
-
Status File Reading:
- Checkpoint 1 →
.claude/.eval-plan-status.json - Checkpoint 2 →
.claude/.review-status.json - Validate timestamp (90-minute expiry)
- Checkpoint 1 →
-
Score Validation:
- Score ≥ 90 → Continue automatically
- Score < 90 in auto mode → Stop
- Score < 90 in interactive mode → Ask user
-
Edge Cases:
- File not found → Stop
- Invalid JSON → Stop
- Expired status → Stop (re-run needed)
- Score unavailable → Stop in auto, ask in interactive
-
User Decision (Interactive Mode):
- Use AskUserQuestion tool
- Present continue/stop options
- Return user's choice
Step 6: Resume Mechanism
def save_resume_point(task_id: str, reason: str):
"""
保存当前工作流恢复点
Args:
task_id: 停止时的任务 ID
reason: 停止原因(score_below_threshold, max_retries_exceeded等)
"""
from datetime import datetime
# 获取任务详细信息
task = TaskGet(task_id)
# 构建恢复点数据
resume_data = {
"timestamp": datetime.now().isoformat(),
"issue_number": task.metadata.get("issue_number"),
"stopped_at_task_id": task_id,
"stopped_at_phase": task.metadata.get("phase"),
"stopped_at_skill": task.metadata.get("skill"),
"reason": reason,
"task_ids": task_ids, # 所有工作流任务的 ID
"mode": mode # auto 或 interactive
}
# 写入状态文件
state_file = ".claude/.auto-solve-state.json"
with open(state_file, "w") as f:
json.dump(resume_data, f, indent=2)
print(f"\n💾 Resume point saved:")
print(f" State file: {state_file}")
print(f" Stopped at: Phase {task.metadata.get('phase')}")
print(f" Reason: {reason}")
print(f"\n Resume with: /auto-solve-issue #{issue_number} --resume")
def load_resume_point() -> dict | None:
"""
加载保存的恢复点
Returns:
恢复点数据,如果不存在则返回 None
"""
state_file = ".claude/.auto-solve-state.json"
try:
with open(state_file, "r") as f:
data = json.load(f)
print(f"\n💾 Resume point found:")
print(f" Saved at: {data['timestamp']}")
print(f" Stopped at: Phase {data['stopped_at_phase']}")
print(f" Reason: {data['reason']}")
return data
except FileNotFoundError:
return None
except json.JSONDecodeError:
print(f"⚠️ Invalid resume state file: {state_file}")
return None
def resume_workflow(resume_data: dict):
"""
从保存的恢复点继续执行工作流
Args:
resume_data: 从 load_resume_point() 加载的恢复点数据
"""
# 提取恢复信息
stopped_task_id = resume_data["stopped_at_task_id"]
task_ids = resume_data["task_ids"]
mode = resume_data["mode"]
issue_number = resume_data["issue_number"]
print(f"\n🔄 Resuming workflow...")
print(f" Issue: #{issue_number}")
print(f" Mode: {mode}")
# 重置停止的任务状态为 pending
# 这样 find_next_available_task() 会重新找到它
TaskUpdate(stopped_task_id, status="pending")
print(f" Reset task {stopped_task_id} to pending")
print(f" Continuing execution loop...")
# 返回恢复后的上下文
return {
"task_ids": task_ids,
"mode": mode,
"issue_number": issue_number,
"resumed": True
}
def cleanup_state_files():
"""
清理工作流状态文件
"""
import os
state_files = [
".claude/.auto-solve-state.json",
".claude/.eval-plan-status.json",
".claude/.review-status.json"
]
for file_path in state_files:
try:
if os.path.exists(file_path):
os.remove(file_path)
print(f" Cleaned: {file_path}")
except Exception as e:
print(f" Warning: Failed to clean {file_path}: {e}")
Resume Point Design:
-
State File:
.claude/.auto-solve-state.json- Stores current workflow state
- Includes task IDs for all phases
- Records reason for stopping
-
Save Triggers:
- Checkpoint score < 90 (auto mode)
- Max retries exceeded
- User stops (interactive mode)
- Score unavailable
-
Resume Data:
stopped_at_task_id: Which task to resume fromtask_ids: All workflow task IDsreason: Why it stoppedmode: Auto or interactive
-
Cleanup:
- Remove state files on completion
- Clean eval-plan and review status files
- Ensures fresh start for next run
Step 7: Error Handling and Retry Logic
Error handling is integrated into the main loop (Step 4) with these patterns:
# 1. Subagent Execution Errors (in main loop)
try:
result = execute_with_subagent(next_task, mode)
except Exception as e:
# Unexpected error during subagent execution
print(f"❌ Unexpected error in Phase {phase}: {e}")
# Increment retry count
retry_count = next_task["metadata"].get("retry_count", 0) + 1
if retry_count >= 3:
# Max retries exceeded
save_resume_point(next_task["id"], f"error_max_retries: {str(e)}")
break
else:
# Retry with updated metadata
TaskUpdate(
next_task["id"],
status="pending",
metadata={"retry_count": retry_count}
)
continue
# 2. Graceful Subagent Failures (returned by execute_with_subagent)
if not result["success"]:
# Subagent reported failure (not exception)
error_msg = result["error"]
print(f"❌ Phase {phase} failed: {error_msg}")
retry_count = next_task["metadata"].get("retry_count", 0) + 1
if retry_count >= 3:
save_resume_point(next_task["id"], f"failed_{skill}: {error_msg}")
break
else:
print(f"⚠️ Retrying (attempt {retry_count + 1}/3)")
TaskUpdate(
next_task["id"],
status="pending",
metadata={"retry_count": retry_count}
)
continue
# 3. Checkpoint Score Unavailable
if is_checkpoint and score is None:
print(f"⚠️ {checkpoint_name} score unavailable")
if mode == "auto":
save_resume_point(next_task["id"], "score_unavailable")
print(f"⏸️ Fix {skill} and resume: /auto-solve-issue #{issue_number} --resume")
break
# 4. Checkpoint Score Below Threshold
if is_checkpoint and score < threshold:
print(f"⚠️ {checkpoint_name} score {score} < {threshold}")
if mode == "auto":
save_resume_point(next_task["id"], "score_below_threshold")
print(f"⏸️ Fix issues and resume: /auto-solve-issue #{issue_number} --resume")
break
# 5. Task System Errors
try:
next_task = find_next_available_task(task_ids)
except Exception as e:
print(f"❌ Error finding next task: {e}")
save_resume_point(task_ids[0], f"task_system_error: {str(e)}")
break
Error Categories:
| Error Type | Handling | Max Retries | Resume Point |
|---|---|---|---|
| Subagent timeout | Retry | 3 | After 3 failures |
| Subagent exception | Retry | 3 | After 3 failures |
| Checkpoint score < 90 | Stop (auto mode) | N/A | Immediate |
| Checkpoint score N/A | Stop (auto mode) | N/A | Immediate |
| Task system error | Stop | N/A | Immediate |
Retry Metadata:
metadata = {
"retry_count": 0, # Increments on each failure
"last_error": str(e), # Error message from last failure
"retry_history": [
{"attempt": 1, "error": "...", "timestamp": "..."},
{"attempt": 2, "error": "...", "timestamp": "..."}
]
}
Graceful Degradation:
- Retry 3 times - Give transient errors a chance
- Save resume point - Never lose progress
- Clear error messages - Tell user what to fix
- Preserve context - Resume from exact checkpoint
Architecture
Core Innovation: Task Dependencies + Subagents
Compared to solve-issue v1.0:
| Dimension | v1.0 | v2.0 |
|---|---|---|
| Orchestrator | Python coordinator | AI + Task system |
| Executor | AI executor (passive loop) | Subagents (active) |
| State Management | JSON files | Task dependencies |
| Context | Shared session | Isolated per phase |
| Resumability | Timeout retry | Checkpoint + resume |
Why this works:
- ✅ AI maintains active control (no passive file reading)
- ✅ Task dependencies auto-unlock next phase
- ✅ Subagents isolate context (no bloat)
- ✅ Checkpoints provide safety (score validation)
Workflow Steps
Copy this checklist to track progress:
Phase Progress:
- [ ] Phase 1: start-issue (create branch + plan)
- [ ] Phase 1.5: eval-plan (validate plan)
- [ ] Checkpoint 1: Score check (≥90 auto-continue)
- [ ] Phase 2: execute-plan (implementation)
- [ ] Phase 2.5: review (code quality)
- [ ] Checkpoint 2: Score check (≥90 auto-continue)
- [ ] Phase 3: finish-issue (commit + PR + merge)
Execute these phases in sequence using the main loop.
Examples
Example 1: Auto Mode (Score ≥ 90)
User: /auto-solve-issue #23
Workflow:
- Create 5 tasks with dependencies
- Phase 1: start-issue → Complete
- Phase 1.5: eval-plan → Score: 95/100
- Checkpoint 1: Auto-continue (score ≥ 90)
- Phase 2: execute-plan → Complete
- Phase 2.5: review → Score: 92/100
- Checkpoint 2: Auto-continue (score ≥ 90)
- Phase 3: finish-issue → Complete
- Report success
Time: 35-65 minutes (no pauses)
Example 2: Interactive Mode
User: /auto-solve-issue #23 --interactive
Workflow: 1-3. Same as auto mode 4. Checkpoint 1: Stop for user review
- User reviews eval-plan results
- User confirms continue 5-7. Same as auto mode
- Checkpoint 2: Stop for user review
- User reviews code quality
- User confirms continue
- Phase 3 completes
Time: 40-70 minutes + review time
Example 3: Resume from Checkpoint
User: /auto-solve-issue #23 --resume
Workflow:
- Load state from
.claude/.auto-solve-state.json - Detect stopped at Checkpoint 1
- User fixed plan (score now 95/100)
- Continue from Phase 2
- Execute remaining phases
- Complete
Time: Depends on checkpoint location
Performance
| Metric | solve-issue v1.0 | auto-solve-issue v2.0 | Improvement |
|---|---|---|---|
| Pauses | 5+ | 0-2 (checkpoints) | 60-100% reduction |
| Total time | 45-75 min | 35-65 min | 20-30% faster |
| User intervention | Multiple prompts | Checkpoints only | Cleaner UX |
| Context usage | Variable | < 50k tokens | Controlled |
Error Handling
Subagent timeout:
⚠️ Subagent timeout in Phase 2
Options:
1. Retry: Automatically retry with new subagent
2. Resume: /auto-solve-issue #23 --resume
3. Manual: Complete phase manually, then resume
Checkpoint failure (score < 90):
⏸️ Checkpoint 1: Score 75/100 ≤ 90
Actions needed:
1. Review eval-plan results
2. Fix issues in plan
3. Resume: /auto-solve-issue #23 --resume
Integration
Comparison with work-issue:
| Feature | work-issue | auto-solve-issue |
|---|---|---|
| Orchestration | AI skill calls | Task dependencies |
| Execution | Skill tool | Subagents |
| Pauses | After each phase | Checkpoints only |
| Maturity | Stable | Experimental (v2.0) |
| Use Case | General | Maximum automation |
When to use each:
- work-issue: Default, stable, well-tested
- auto-solve-issue: Need maximum speed, trust automation
Best Practices
- Use for well-defined issues - Complex/vague issues may fail checkpoints
- Trust the scores - Auto mode relies on eval-plan/review scores (≥90)
- Have fallback - If issues occur, use /work-issue as backup
- Monitor first run - Watch the continuous execution to build confidence
- Provide feedback - Report bugs/issues to improve the skill
Task Management
When executing, the skill creates this task structure:
tasks = [
TaskCreate("Phase 1: start-issue", ...),
TaskCreate("Phase 1.5: eval-plan", ..., blockedBy=[task1]),
TaskCreate("Phase 2: execute-plan", ..., blockedBy=[task2]),
TaskCreate("Phase 2.5: review", ..., blockedBy=[task3]),
TaskCreate("Phase 3: finish-issue", ..., blockedBy=[task4])
]
Updates status as each phase completes, automatically unlocking the next.
Final Verification
- [ ] All 5 phases completed
- [ ] Both checkpoints passed (or manually approved)
- [ ] Issue closed on GitHub
- [ ] PR merged to main
- [ ] State files cleaned up
Related Skills
- /work-issue - Stable alternative (AI orchestration)
- /start-issue - Phase 1 (called by this skill via subagent)
- /eval-plan - Phase 1.5 (called by this skill via subagent)
- /execute-plan - Phase 2 (called by this skill via subagent)
- /review - Phase 2.5 (called by this skill via subagent)
- /finish-issue - Phase 3 (called by this skill via subagent)
Version: 2.0.0 Last Updated: 2026-03-18 Changelog:
- v2.0.0 (2026-03-18): Major redesign - replace solve-issue v1.0 with auto-solve-issue v2.0 (Issue #258)
Pattern: Meta-Workflow Orchestrator (Task dependencies + Subagents) Status: Experimental Compliance: ADR-001 ✅
Recommended Agent Skills
Expand your agent's capabilities with these related and highly-rated skills.
agent-ops-spec
Manage specification documents in .agent/specs/. Use when user provides requirements, acceptance criteria, or feature descriptions that need to be tracked and validated against implementation.
agent-ops-state
Maintain .agent state files. Use at session start, after meaningful steps, and before concluding: read/update constitution/memory/focus/issues/baseline consistently.
agent-ops-spec
Manage specification documents in .agent/specs/. Use when user provides requirements, acceptance criteria, or feature descriptions that need to be tracked and validated against implementation.
agent-ops-testing
Test strategy, execution, and coverage analysis. Use when designing tests, running test suites, or analyzing test results beyond baseline checks.
agent-ops-testing
Test strategy, execution, and coverage analysis. Use when designing tests, running test suites, or analyzing test results beyond baseline checks.
agent-ops-state
Maintain .agent state files. Use at session start, after meaningful steps, and before concluding: read/update constitution/memory/focus/issues/baseline consistently.
Didn't find tool you were looking for?