Task Fields in tasks.json
Tasks in tasks.json have the following structure:
The statuses are
pending, in-progress, review, done, deferred, cancelled and blocked. Files from Task Master or an AI tool may say completed: TaskGraph reads it as done on a task or a subtask, in tasks.json and archive.json, and the next save writes done.
Task File Format
Individual task files follow this format:User-Defined Metadata Field
Themetadata field allows you to store arbitrary custom data on tasks without requiring schema changes. This is useful for:
- External IDs: Link tasks to GitHub issues, Jira tickets, Linear issues, etc.
- Workflow data: Track sprints, story points, custom statuses
- Integration data: Store sync timestamps, external system references
- Custom tracking: UUIDs, version numbers, audit information
Key Characteristics
Fully Optional
The field is optional. Existing tasks work without it.
AI-Safe
AI operations preserve your metadata - it’s never overwritten by AI.
Flexible Schema
Store any JSON-serializable data: strings, numbers, objects, arrays.
Subtask Support
Both tasks and subtasks can have their own metadata.
Usage Examples
GitHub Issue LinkingWhere a task came from
parse-prd records the PRD section each task implements in metadata.source: the PRD’s path relative to the project root, then the heading’s anchor as GitHub would write it.
sourceHash is a hash of that section’s text when the task was made. The tag’s own metadata keeps the hash of every section of the PRD (prdSections), so parse-prd --append can tell which sections are new, changed or removed since the last parse.
The AI is given the PRD’s headings and picks one per task; an answer that matches no heading is dropped rather than stored. expand copies the source to each new subtask. taskgraph show prints it under the status line, and taskgraph validate-dependencies uses it to list PRD sections that have no task (see Managing Task Dependencies).
Metadata Behavior
Updating Metadata via MCP
Theupdate_task and update_subtask MCP tools support a metadata parameter for updating task metadata. This feature is disabled by default for safety.
To enable MCP metadata updates:
Add TASKGRAPH_ALLOW_METADATA_UPDATES=true to your MCP server environment configuration in .mcp.json:
The
metadata parameter accepts a JSON string. The new metadata is merged with existing metadata, allowing you to update specific fields without losing others.Features in Detail
Analyzing Task Complexity
Analyzing Task Complexity
The
analyze-complexity command:- Analyzes each task using AI to assess its complexity on a scale of 1-10
- Recommends optimal number of subtasks based on configured DEFAULT_SUBTASKS
- Generates tailored prompts for expanding each task
- Creates a comprehensive JSON report with ready-to-use commands
- Saves the report to scripts/task-complexity-report.json by default
- Complexity analysis for each task (scored 1-10)
- Recommended number of subtasks based on complexity
- AI-generated expansion prompts customized for each task
- Ready-to-run expansion commands directly within each task analysis
Viewing Complexity Report
Viewing Complexity Report
The
complexity-report command:- Displays a formatted, easy-to-read version of the complexity analysis report
- Shows tasks organized by complexity score (highest to lowest)
- Provides complexity distribution statistics (low, medium, high)
- Highlights tasks recommended for expansion based on threshold score
- Includes ready-to-use expansion commands for each complex task
- If no report exists, offers to generate one on the spot
Smart Task Expansion
Smart Task Expansion
The
expand command automatically checks for and uses the complexity report:When a complexity report exists:- Tasks are automatically expanded using the recommended subtask count and prompts
- When expanding all tasks, they’re processed in order of complexity (highest first)
- Research-backed generation is preserved from the complexity analysis
- You can still override recommendations with explicit command-line options
Finding the Next Task
Finding the Next Task
The
next command:- Identifies tasks that are pending/in-progress and have all dependencies done
- Prefers subtasks of an in-progress parent, then orders candidates by priority, then by how many unfinished tasks they unblock, then by fewer dependencies, then by task ID (see Dependency Graph)
- Displays comprehensive information about the selected task:
- Basic task details (ID, title, priority, dependencies)
- Implementation details
- Subtasks (if they exist)
- Provides contextual suggested actions:
- Command to mark the task as in-progress
- Command to mark the task as done
- Commands for working with subtasks
Viewing Specific Task Details
Viewing Specific Task Details
The
show command:- Displays comprehensive details about a specific task or subtask
- Shows task status, priority, dependencies, and detailed implementation notes
- For parent tasks, displays all subtasks and their status
- For a subtask, prints the same status line as
next: dependencies on siblings as full IDs (depends on 3.1), and the parent’s priority when the subtask has none of its own - Provides contextual action suggestions based on the task’s state
- Works with both regular tasks and subtasks (using the format taskId.subtaskId)
Best Practices for AI-Driven Development
📝 Detailed PRD
The more detailed your PRD, the better the generated tasks will be.
👀 Review Tasks
After parsing the PRD, review the tasks to ensure they make sense and have
appropriate dependencies.
📊 Analyze Complexity
Use the complexity analysis feature to identify which tasks should be broken
down further.
⛓️ Follow Dependencies
Always respect task dependencies - Claude Code will help with this.
🔄 Update As You Go
If your implementation diverges from the plan, use the update command to
keep future tasks aligned.
📦 Break Down Tasks
Use the expand command to break down complex tasks into manageable subtasks.
🔄 Regenerate Files
After any updates to tasks.json, regenerate the task files to keep them in
sync.
💬 Provide Context
When asking Claude Code to help with a task, provide context about what
you’re trying to achieve.
✅ Validate Dependencies
Periodically run the validate-dependencies command to check for invalid or
circular dependencies.
Tagged Task Lists
tasks.json organizes tasks into separate contexts called tags, so you can keep different branches, features or project phases apart.
- Isolation: tasks in different tags never interfere, and each tag numbers its tasks from 1.
- Current tag: stored in
.taskgraph/state.json, falling back tomaster. Override it per command with--tag. - Dependencies must reference tasks in the same tag, and subtask IDs must be unique within their parent.
- Legacy files: a
tasks.jsonin the old{"tasks": [...]}shape is converted to{"master": {"tasks": [...]}}on first read, with all data preserved.

