TaskCreate, TaskUpdate, TaskList, TaskGet: Complete Reference

The complete API reference for Claude Code's Task tools. Learn how to create, track, update, and query tasks programmatically for complex multi-step workflows.

Introduction

Claude Code includes four Task tools that enable programmatic task management within your development workflow. These tools let you create tasks, track their status, manage dependencies, and coordinate work across complex multi-step projects.

Unlike simple to-do lists, Claude Code's Task tools support dependency tracking between tasks, ownership assignment, and status workflows. This makes them suitable for breaking down large features into manageable pieces that can be completed in sequence or parallel.

The Four Task Tools

TaskCreate
Create new tasks with subjects, descriptions, and spinner text for progress indication.
TaskGet
Retrieve full details of a specific task including its status and dependencies.
TaskUpdate
Modify existing tasks: change status, assign ownership, add dependencies.
TaskList
View all tasks with their current status, owners, and blocking relationships.

Quick Reference Table

Tool Purpose Key Parameters
TaskCreate Create a new task subject, description, activeForm
TaskGet Retrieve task details taskId
TaskUpdate Modify an existing task taskId, status, owner, addBlockedBy, addBlocks
TaskList List all tasks (none)

TaskCreate

The TaskCreate tool creates a new task in the task system. Use it to define work items that need to be tracked, whether they represent features, bugs, or subtasks of a larger initiative.

Parameters

Parameter Description
subject required A brief title for the task. Should be descriptive but concise, typically under 60 characters. This appears in task lists and serves as the primary identifier for humans.
description required Detailed requirements for the task. Include acceptance criteria, technical constraints, and any context needed to complete the work. Supports markdown formatting.
activeForm optional Present continuous text displayed in the spinner while the task is being worked on. For example: "Running tests", "Building components", "Analyzing code". Defaults to "Working on task".

Example Usage

TaskCreate
TaskCreate:
  subject: "Add email validation to signup form"
  description: |
    Implement client-side email validation for the signup form.

    Requirements:
    - Validate email format using regex
    - Show inline error message below input
    - Disable submit button until valid
    - Match existing form validation patterns

    File: src/components/SignupForm.tsx
  activeForm: "Implementing email validation"

Returns

TaskCreate returns the newly created task object with a unique taskId that you will use with other Task tools:

Response
{
  "taskId": "task_abc123",
  "subject": "Add email validation to signup form",
  "status": "pending",
  "createdAt": "2025-01-28T10:30:00Z"
}

Best Practices for Task Creation

  • Be specific in subjects: "Add email validation" is better than "Fix form"
  • Include acceptance criteria: What does "done" look like?
  • Reference files: Point to specific files that need modification
  • Keep descriptions focused: One task should do one thing well
  • Use activeForm meaningfully: It provides visual feedback during long operations
Task IDs are Stable: Once created, a task's ID never changes. Store it if you need to reference the task later in your workflow.

TaskGet

The TaskGet tool retrieves complete details about a specific task. Use it when you need the full description before starting work, or when you need to check a task's current status and dependencies.

Parameters

Parameter Description
taskId required The unique identifier of the task to retrieve. This is the ID returned by TaskCreate or shown in TaskList.

Example Usage

TaskGet
TaskGet:
  taskId: "task_abc123"

Returns

TaskGet returns the complete task object with all its properties:

Response
{
  "taskId": "task_abc123",
  "subject": "Add email validation to signup form",
  "description": "Implement client-side email validation...",
  "status": "in_progress",
  "owner": "frontend-agent",
  "blocks": ["task_def456"],
  "blockedBy": [],
  "createdAt": "2025-01-28T10:30:00Z",
  "updatedAt": "2025-01-28T10:45:00Z"
}

Response Fields

Field Description
taskId Unique identifier for the task
subject Brief title of the task
description Full task description with requirements
status Current status: pending, in_progress, completed, or deleted
owner Agent or user assigned to the task (if any)
blocks Array of task IDs that this task is blocking
blockedBy Array of task IDs that must complete before this task can start

When to Use TaskGet

  • Before starting work: Read the full description to understand requirements
  • Checking dependencies: See what tasks are blocking or blocked by this one
  • Verifying status: Confirm a task is available before claiming it
  • Reviewing ownership: See who is currently working on a task

TaskUpdate

The TaskUpdate tool modifies existing tasks. This is your primary tool for managing task lifecycle: claiming tasks, marking them complete, establishing dependencies, and updating details as requirements evolve.

Parameters

Parameter Description
taskId required The unique identifier of the task to update.
status optional New status for the task. Valid values: pending, in_progress, completed, deleted.
subject optional Updated title for the task. Use when requirements change and the original subject no longer fits.
description optional Updated description. Use to add clarifications, update requirements, or document decisions made during implementation.
owner optional Agent or user ID to assign to the task. Use to claim a task or delegate it to a specific agent.
addBlockedBy optional Array of task IDs that must complete before this task can start. Adds to existing blockedBy list.
addBlocks optional Array of task IDs that this task should block. Adds to existing blocks list.

Common Operations

Claiming a Task

When an agent picks up a task to work on, they should claim ownership and update the status:

Claiming a Task
TaskUpdate:
  taskId: "task_abc123"
  owner: "frontend-agent"
  status: "in_progress"

Completing a Task

When work is finished, mark the task as completed. This automatically unblocks any dependent tasks:

Completing a Task
TaskUpdate:
  taskId: "task_abc123"
  status: "completed"

Adding Dependencies

Establish that one task must complete before another can start:

Adding Dependencies
# Task B cannot start until Task A completes
TaskUpdate:
  taskId: "task_B"
  addBlockedBy: ["task_A"]

# Equivalent: Task A blocks Task B
TaskUpdate:
  taskId: "task_A"
  addBlocks: ["task_B"]

Deleting a Task

Remove a task that is no longer needed. Use this for duplicate tasks, cancelled features, or tasks created in error:

Deleting a Task
TaskUpdate:
  taskId: "task_abc123"
  status: "deleted"
Dependency Cycles: Be careful not to create circular dependencies (A blocks B, B blocks A). The system will prevent tasks from becoming available if they are stuck in a dependency cycle.

TaskList

The TaskList tool returns all tasks in the system with their current status, owners, and blocking relationships. Use it to get an overview of work in progress and identify available tasks.

Parameters

TaskList takes no parameters. It returns all tasks regardless of status.

TaskList
TaskList

Returns

TaskList returns an array of task summaries. Note that descriptions are truncated; use TaskGet for full details:

Response
{
  "tasks": [
    {
      "taskId": "task_abc123",
      "subject": "Add email validation to signup form",
      "status": "completed",
      "owner": "frontend-agent",
      "blockedBy": []
    },
    {
      "taskId": "task_def456",
      "subject": "Add password strength indicator",
      "status": "in_progress",
      "owner": "frontend-agent",
      "blockedBy": []
    },
    {
      "taskId": "task_ghi789",
      "subject": "Write signup form tests",
      "status": "pending",
      "owner": null,
      "blockedBy": ["task_abc123", "task_def456"]
    }
  ]
}

Understanding "Available" Tasks

A task is considered "available" to work on when:

  • Status is pending (not yet started)
  • The blockedBy array is empty (no pending dependencies)
  • The owner is null (not claimed by another agent)

In the example above, only tasks with empty blockedBy arrays and pending status are ready to be claimed. Task task_ghi789 cannot start until both task_abc123 and task_def456 are completed.

Filtering Results

TaskList returns all tasks. To find specific subsets, filter the results in your code:

Common Filters
# Available tasks (pending + unblocked + unassigned)
available = [t for t in tasks
             if t.status == "pending"
             and len(t.blockedBy) == 0
             and t.owner is None]

# My tasks (assigned to me)
my_tasks = [t for t in tasks
            if t.owner == "my-agent-id"]

# Blocked tasks (waiting on dependencies)
blocked = [t for t in tasks
           if len(t.blockedBy) > 0]

Status Workflow

Tasks follow a straightforward lifecycle from creation to completion. Understanding this flow helps you manage work effectively.

pending
in_progress
completed

Status Definitions

Status Meaning Next Actions
pending Task created but not yet started. May be blocked by dependencies or waiting to be claimed. Claim ownership and move to in_progress, or delete if no longer needed.
in_progress Task is actively being worked on. Should have an owner assigned. Complete the work and move to completed, or return to pending if releasing the task.
completed Task work is finished. Any tasks blocked by this one become unblocked. Generally final. Can be reopened to pending if issues discovered.
deleted Task removed from active work. Will not appear in most queries. Final state. Create a new task if work is needed later.

When to Use Each Status

  • pending: Default for new tasks. Return tasks here if you need to pause work without abandoning it.
  • in_progress: Always set when actively working. Signals to other agents that the task is claimed.
  • completed: Set when all acceptance criteria are met. Triggers unblocking of dependent tasks.
  • deleted: Use sparingly. Prefer completing tasks with notes if work was partially done.
Automatic Unblocking: When a task moves to "completed", any tasks that had it in their blockedBy array are automatically updated. You do not need to manually remove blocking relationships.

Practical Examples

These examples demonstrate common patterns for using Task tools in real development workflows.

Creating a 3-Task Project

Break down a feature into sequential tasks with proper dependencies:

Creating Dependent Tasks
# Step 1: Create the first task (no dependencies)
TaskCreate:
  subject: "Create User model schema"
  description: |
    Define the User model with fields:
    - id (UUID)
    - email (string, unique)
    - passwordHash (string)
    - createdAt (timestamp)

    File: src/models/User.ts
  activeForm: "Creating User model"

# Returns: taskId = "task_001"

# Step 2: Create second task that depends on the first
TaskCreate:
  subject: "Implement UserService"
  description: |
    Create UserService with methods:
    - createUser(email, password)
    - getUserById(id)
    - getUserByEmail(email)

    File: src/services/UserService.ts
  activeForm: "Building UserService"

# Returns: taskId = "task_002"

TaskUpdate:
  taskId: "task_002"
  addBlockedBy: ["task_001"]

# Step 3: Create third task that depends on both
TaskCreate:
  subject: "Write User integration tests"
  description: |
    Test the full user creation and retrieval flow.

    File: tests/integration/user.test.ts
  activeForm: "Writing tests"

# Returns: taskId = "task_003"

TaskUpdate:
  taskId: "task_003"
  addBlockedBy: ["task_001", "task_002"]

Agent Workflow: Claim, Work, Complete

The typical pattern for an agent picking up and completing work:

Agent Workflow
# 1. Check available tasks
TaskList
# Response shows task_001 is pending with no blockers

# 2. Get full details before starting
TaskGet:
  taskId: "task_001"
# Response includes full description with requirements

# 3. Claim the task and start work
TaskUpdate:
  taskId: "task_001"
  owner: "backend-agent"
  status: "in_progress"

# 4. ... do the actual work ...

# 5. Mark complete when done
TaskUpdate:
  taskId: "task_001"
  status: "completed"

# 6. Check for newly available tasks
TaskList
# Response now shows task_002 is available (task_001 completed)

Handling Dependencies and Unblocking

When tasks complete, dependent tasks automatically become available:

Dependency Resolution
# Initial state:
# - task_001: pending (no dependencies) <- AVAILABLE
# - task_002: pending (blocked by task_001)
# - task_003: pending (blocked by task_001, task_002)

# After completing task_001:
TaskUpdate:
  taskId: "task_001"
  status: "completed"

# New state:
# - task_001: completed
# - task_002: pending (no dependencies) <- NOW AVAILABLE
# - task_003: pending (blocked by task_002)

# After completing task_002:
TaskUpdate:
  taskId: "task_002"
  status: "completed"

# Final state:
# - task_001: completed
# - task_002: completed
# - task_003: pending (no dependencies) <- NOW AVAILABLE

Going Further

The Task tools are powerful primitives for managing work. They provide the building blocks for tracking dependencies, assigning ownership, and coordinating complex multi-step workflows within Claude Code sessions.

However, raw Task tools require significant manual coordination. You need to create tasks, establish dependencies, track which agent should handle what, and manage the entire workflow yourself. This works for simple projects but becomes cumbersome as complexity grows.

The Limitation of Manual Task Management

Using Task tools directly means you must:

  • Manually break down every feature into tasks
  • Remember to set up dependencies correctly
  • Track which agent types handle which work
  • Coordinate handoffs between tasks
  • Handle edge cases when tasks fail or need revision

This overhead is manageable for small projects, but scales poorly. A 10-task feature requires careful coordination; a 50-task project becomes a full-time job just managing the task system.

Structured Agent Teams: The Better Approach

Instead of manually orchestrating tasks, Claude Architect provides pre-configured agent teams with built-in coordination. You describe what you want to build; the system handles task decomposition, agent assignment, and dependency management automatically.

Think of it as the difference between writing assembly code and using a high-level language. Task tools are the assembly; structured agent teams are the abstraction that makes you productive.

Ready for Effortless Coordination?

Claude Architect turns manual task management into automatic orchestration. Define your project once, let the system handle the rest.

Join the Waitlist