Install any skill in seconds. Free to start, no credit card required.
Get Started Free →Manage tasks with Claude Code native tools — use to track TODOs, delegate work, and monitor progress
.claude/skills/hashgraph-online-skill-task-management/SKILL.md| Test case | Without → With | Effect | Δ tokens | Δ turns |
|---|---|---|---|---|
| case-14 | ✗→✓ | ▲ Improved | 156% | 0% |
| case-21 | ✗→✓ | ▲ Improved | 155% | 0% |
| case-04 | ✓→✗ | ▼ Worse | 183% | 0% |
| case-05 | ✓→✗ | ▼ Worse | 1068% | 0% |
| case-06 | ✓→✗ | ▼ Worse | 206% | 0% |
> Host: Codex CLI — This skill was designed for Claude Code and adapted for Codex. > Cross-reference commands use installed skill names in Codex rather than /octo:* slash commands. > Use the active Codex shell and subagent tools. Do not claim a provider, model, or host subagent is available until the current session exposes it. > For host tool equivalents, see skills/blocks/codex-host-adapter.md.
Systematic task orchestration for multi-step work, progress checkpointing, and seamless task resumption across sessions.
Core principle: Track → Checkpoint → Resume → Complete.
v7.23.0 Migration: This skill now uses native Claude Code host subagent tools:
TaskCreate - Create new tasksTaskUpdate - Update task status/detailsTaskList - View all tasksTaskGet - Get specific task detailsBenefits:
Use this skill when user wants to:
Do NOT use for:
When user says "add to the todo's" or similar:
markdown**What would you like to add to the todo list?** I'll help you capture this task. Please provide: - Task description (what needs to be done) - Any dependencies or prerequisites - Priority (if applicable)
After getting details, use TaskCreate to add:
javascriptTaskCreate({ subject: "[Brief task description]", description: "[Detailed description including dependencies and context]", activeForm: "Working on [task description]" })
Then confirm to user:
✅ Task created: [Task description]
View all tasks with TaskList or use /tasks command.When user says "save progress" or "checkpoint this":
bash# Check git status git status # Check current branch git branch --show-current # Check uncommitted work git diff --stat
Option A: Git-based checkpoint (if git repo)
bash# Create a work-in-progress commit git add . git commit -m "WIP: [description of current state] Progress checkpoint - work in progress Not ready for review or merge Current state: - [What's completed] - [What's in progress] - [What's next] Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>"
Option B: Task-based checkpoint (preferred for tracking)
Create checkpoint task with detailed state:
javascriptTaskCreate({ subject: "Checkpoint: [Brief description]", description: ` 📍 CHECKPOINT: ${new Date().toISOString()} Completed: ✓ [Task 1] ✓ [Task 2] In Progress: ⚙️ [Current task with details] Next Steps: - [ ] [Next task 1] - [ ] [Next task 2] - [ ] [Next task 3] Context: - Branch: ${branchName} - Last commit: ${lastCommit} - Files changed: ${filesChanged} `, activeForm: "Checkpoint saved" })
Mark completed tasks as done:
javascript// For each completed task TaskUpdate({ taskId: "[task-id]", status: "completed" })
Mark current task as in_progress:
javascriptTaskUpdate({ taskId: "[current-task-id]", status: "in_progress" })
markdown✅ Progress saved! To resume this work: 1. Run: git checkout [branch-name] 2. View tasks: TaskList 3. Say: "resume tasks" or "pick up where we left off" Current state: - Branch: [branch-name] - Tasks: [X completed, Y in progress, Z pending] - Last checkpoint: [timestamp]
When user says "resume tasks" or "pick up where we left off":
javascript// Get all tasks const tasks = TaskList() // Filter by status const completed = tasks.filter(t => t.status === 'completed') const inProgress = tasks.filter(t => t.status === 'in_progress') const pending = tasks.filter(t => t.status === 'pending') // Find checkpoint task (if exists) const checkpoint = tasks.find(t => t.subject.startsWith('Checkpoint:'))
bash# Check for WIP commits git log --oneline -10 | grep WIP # Check current branch git branch --show-current # Check git status git status
markdown📋 **Resuming from last checkpoint** **Branch:** [branch-name] **Last checkpoint:** [timestamp from WIP commit or checkpoint task] **Completed:** (${completed.length} tasks) ${completed.map(t => `✓ ${t.subject}`).join('\n')} **In Progress:** (${inProgress.length} tasks) ${inProgress.map(t => `⚙️ ${t.subject}`).join('\n')} **Next Steps:** (${pending.length} tasks) ${pending.map((t, i) => `${i + 1}. [ ] ${t.subject}`).join('\n')} **Would you like me to:** 1. Continue with the next task? 2. Modify the plan? 3. See more details about current state?
javascript const nextTask = pending[0] TaskUpdate({ taskId: nextTask.id, status: 'in_progress' }) // Begin working on nextTask
When user says "proceed to next steps":
javascriptconst tasks = TaskList() const currentTask = tasks.find(t => t.status === 'in_progress') if (currentTask) { console.log(`Current task: ${currentTask.subject}`) console.log(`Status: ${currentTask.status}`) }
javascript// Mark current task as complete if (currentTask) { TaskUpdate({ taskId: currentTask.id, status: 'completed' }) console.log(`✓ ${currentTask.subject}`) } // Get next pending task const nextTask = tasks.find(t => t.status === 'pending' && !t.blockedBy?.length) if (nextTask) { // Mark as in progress TaskUpdate({ taskId: nextTask.id, status: 'in_progress' }) console.log(`\n⚙️ ${nextTask.subject}`) console.log(`\nProceeding with: ${nextTask.description}`) }
Begin working on the next task immediately after marking it as in_progress.
If you have existing .claude/todos.md or similar files:
bash# Run migration script "${HOME}/.claude-octopus/plugin/scripts/migrate-todos.sh"
This will:
.claude/archived-todos/For each todo item in your .md file:
markdown<!-- Old format in todos.md --> - [ ] Implement user authentication - [x] Set up database - [ ] Create API endpoints
Convert to:
javascript// New format using native tasks TaskCreate({ subject: "Implement user authentication", description: "Create auth system with JWT tokens", activeForm: "Implementing authentication" }) TaskCreate({ subject: "Set up database", description: "Configure PostgreSQL and run migrations", activeForm: "Setting up database" }) // Mark as completed since it was [x] TaskUpdate({ taskId: "...", status: "completed" }) TaskCreate({ subject: "Create API endpoints", description: "Build REST API for user operations", activeForm: "Creating API endpoints" })
Opt-out for users who prefer old system:
Create .claude/claude-octopus.local.md with:
yamluse_native_tasks: false # Claude Octopus Local Configuration This project uses legacy task plan tool tool instead of native Task management.
When use_native_tasks: false, skill falls back to task plan tool behavior.
User: "save progress and prepare for PR"
1. Use skill-task-management to checkpoint (create tasks for current state)
2. Then use skill-finish-branch to prepare PRUser: "add implementation of auth system to todos"
1. Use skill-task-management to add high-level task
2. Use flow-develop to break down and implement
3. Update tasks as work progressesUser: "checkpoint this, I found a bug"
1. Use skill-task-management to save current progress (checkpoint task)
2. Use skill-debug to investigate the bug
3. Return to saved checkpoint after fixGood task:
javascriptTaskCreate({ subject: "Implement token refresh with 15-minute expiration", description: ` Create token refresh endpoint that: - Validates refresh token from secure HTTP-only cookie - Issues new access token with 15min expiry - Rotates refresh token for security - Returns 401 if refresh token invalid/expired Dependencies: OAuth provider setup must be complete `, activeForm: "Implementing token refresh logic" })
Poor task:
javascriptTaskCreate({ subject: "Do auth stuff", description: "Fix things", activeForm: "Working" })
For tasks with prerequisites:
javascript// First task TaskCreate({ subject: "Set up OAuth provider configuration", description: "Configure Auth0 application settings", activeForm: "Configuring OAuth provider" }) // Dependent task TaskCreate({ subject: "Implement token refresh endpoint", description: "Create /auth/refresh endpoint", activeForm: "Implementing refresh endpoint", addBlockedBy: ["1"] // Blocked by task #1 })
When checkpointing, always include:
Example checkpoint task:
javascriptTaskCreate({ subject: "Checkpoint: Auth implementation 70% complete", description: ` 📍 CHECKPOINT: 2026-02-03T14:30:00Z Completed: ✓ OAuth provider configuration (Auth0) ✓ Token exchange endpoint (/auth/login) ✓ User session middleware In Progress: ⚙️ Token refresh logic (70% done) - Validation complete - Token rotation TODO - Cookie handling TODO Next: - [ ] Complete token rotation logic - [ ] Add logout endpoint - [ ] Add session expiration handling - [ ] Write integration tests Branch: feature/auth-system Last commit: abc123f "Add session middleware" Decisions Made: - Using Auth0 (rationale: enterprise-grade, handles complexity) - 15-minute access token expiry (security vs UX balance) - HTTP-only cookies for refresh tokens (XSS protection) `, activeForm: "Checkpoint saved" })
User: "save progress, I'm done for today"
Action:
1. Create WIP commit with current state
2. Create checkpoint task with completed/pending breakdown
3. Mark in-progress tasks with current status
4. Provide resume instructions for tomorrowUser: "checkpoint this, need to work on something else"
Action:
1. Save current branch state (WIP commit)
2. Create checkpoint task with detailed context
3. Mark current task as pending (will resume later)
4. Ready for resume when user returnsUser: "save progress for Claude to pick up"
Action:
1. Create comprehensive checkpoint task
2. Document all context and decisions
3. Mark in-progress tasks with current state
4. Ensure new session can load task state and resume seamlessly| Action | Why It's Wrong | |--------|----------------| | Checkpoint without documenting context | Next session won't know what was happening | | Skip WIP commit for code changes | Lose work if something breaks | | Generic "proceed to next" without checking TaskList | Might skip incomplete work | | Vague task subjects/descriptions | Unclear what needs to be done | | Resume without showing TaskList state | User doesn't know where they are | | Create tasks without activeForm | No progress indication in UI |
| User Intent | Skill Action | Tool Used | |-------------|--------------|-----------| | "add to todos" | Gather details, create task | TaskCreate | | "save progress" | Create checkpoint task + WIP commit | TaskCreate + git | | "resume tasks" | Load task state, show status, ask direction | TaskList | | "proceed to next" | Complete current, start next | TaskUpdate | | "checkpoint this" | Create detailed checkpoint task | TaskCreate |
pending → in_progress → completed
↓
deleted (if no longer needed)Best practices:
pending statein_progress when starting workcompleted only when fully donedeleted for cancelled/obsolete tasksTask management → Clear state + Easy resume + Native UI
Otherwise → Lost context + Duplicate work + No visibilityTrack everything. Checkpoint frequently. Resume seamlessly. Use native tools.
javascript// User: "add implementing auth to my todos" // Step 1: Create main task TaskCreate({ subject: "Implement user authentication system", description: ` Build complete auth system with: - OAuth 2.0 (Auth0 provider) - JWT token management - Refresh token rotation - Session middleware - Logout functionality `, activeForm: "Planning authentication implementation" }) // User works on it... // User: "save progress for tomorrow" // Step 2: Create checkpoint TaskCreate({ subject: "Checkpoint: Auth implementation in progress", description: ` 📍 Checkpoint: 2026-02-03T18:30:00Z Completed: ✓ OAuth configuration ✓ Login endpoint In Progress: ⚙️ Token refresh (50%) Next: - [ ] Complete refresh logic - [ ] Add logout - [ ] Write tests Branch: feature/auth Commit: abc123f `, activeForm: "Checkpoint saved" }) // Step 3: Update main task status TaskUpdate({ taskId: "1", status: "in_progress" }) // User: "resume tasks" (next day) // Step 4: Load and present state const tasks = TaskList() // Present: "You have 1 in_progress task, last checkpoint 2026-02-03T18:30:00Z" // Show details from checkpoint task // User: "continue" // Step 5: Resume work const currentTask = tasks.find(t => t.status === 'in_progress') // Begin working on token refresh where they left off
| Case | Status | Duration (ms) | Turns | Tokens | Tool calls | ||||||||
|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
| Without | With | Δ | Without | With | Δ | Without | With | Δ | Without | With | Δ | ||
case-01 | fail→fail | 15,033 | 22,748 | +51% | 1 | 1 | 0% | 2,728 | 4,684 | +72% | 0 | 0 | — |
case-02 | fail→fail | 6,005 | 11,768 | +96% | 1 | 1 | 0% | 199 | 4,300 | +2061% | 0 | 0 | — |
case-03 | fail→fail | 11,347 | 18,854 | +66% | 1 | 1 | 0% | 207 | 4,425 | +2038% | 0 | 0 | — |
case-04 | pass→fail | 14,463 | 17,417 | +20% | 1 | 1 | 0% | 1,583 | 4,484 | +183% | 0 | 0 | — |
case-05 | pass→fail | 8,256 | 13,504 | +64% | 1 | 1 | 0% | 365 | 4,265 | +1068% | 0 | 0 | — |
case-06 | pass→fail | 8,866 | 17,407 | +96% | 1 | 1 | 0% | 1,417 | 4,338 | +206% | 0 | 0 | — |
case-07 | fail→fail | 24,226 | 18,283 | -25% | 1 | 1 | 0% | 1,711 | 4,674 | +173% | 0 | 0 | — |
case-16 | fail→fail | 7,235 | 5,980 | -17% | 1 | 1 | 0% | 1,104 | 4,091 | +271% | 0 | 0 | — |
case-08 | fail→fail | 4,564 | 17,758 | +289% | 1 | 1 | 0% | 653 | 4,759 | +629% | 0 | 0 | — |
case-09 | fail→fail | 4,025 | 2,860 | -29% | 1 | 1 | 0% | 598 | 4,149 | +594% | 0 | 0 | — |
case-10 | fail→fail | 8,147 | 13,313 | +63% | 1 | 1 | 0% | 442 | 4,216 | +854% | 0 | 0 | — |
case-11 | fail→fail | 8,888 | 15,946 | +79% | 1 | 1 | 0% | 349 | 4,231 | +1112% | 0 | 0 | — |
case-12 | fail→fail | 15,368 | 11,831 | -23% | 1 | 1 | 0% | 1,506 | 4,267 | +183% | 0 | 0 | — |
case-13 | fail→fail | 20,443 | 10,845 | -47% | 1 | 1 | 0% | 651 | 4,355 | +569% | 0 | 0 | — |
case-14 | fail→pass | 11,424 | 11,021 | -4% | 1 | 1 | 0% | 1,943 | 4,967 | +156% | 0 | 0 | — |
case-15 | fail→fail | 6,717 | 14,889 | +122% | 1 | 1 | 0% | 933 | 4,550 | +388% | 0 | 0 | — |
case-17 | fail→fail | 22,211 | 29,243 | +32% | 1 | 1 | 0% | 2,846 | 5,620 | +97% | 0 | 0 | — |
case-18 | fail→fail | 9,819 | 15,533 | +58% | 1 | 1 | 0% | 845 | 4,357 | +416% | 0 | 0 | — |
case-19 | fail→fail | 16,318 | 14,124 | -13% | 1 | 1 | 0% | 2,004 | 4,371 | +118% | 0 | 0 | — |
case-20 | fail→fail | 4,748 | 6,545 | +38% | 1 | 1 | 0% | 647 | 4,497 | +595% | 0 | 0 | — |
case-21 | fail→pass | 13,210 | 10,427 | -21% | 1 | 1 | 0% | 1,876 | 4,790 | +155% | 0 | 0 | — |
case-22 | pass→pass | 19,797 | 13,063 | -34% | 1 | 1 | 0% | 2,265 | 5,210 | +130% | 0 | 0 | — |
DecimalAI ran this skill against gemini-3.6-flash twice over the same eval suite — once with the skill loaded and once without — and compared the two runs case by case. 22 cases were attempted, and 4 counted toward the lift figure. The other 18 produced results that are not comparable between the two arms, so they are excluded from the headline rather than averaged into it. The headline lift of -5 percentage points is the difference between those two pass rates over the 4 comparable cases. 4 cases got worse with the skill loaded, and they are included in that figure.
Without the skill loaded, the model failed this case. With it loaded, the same prompt on the same model passed. This is one improved case from the latest verified run; every case, including any that regressed, is in the table above.
Other measured skills in the registry, with their headline benchmark lift.