| name | task-workflow |
| description | This skill should be used when an AI agent needs to "add a task", "create a task", "update a task", "modify a task", "complete a task", "mark task done", "close a task", "start working on a task", "annotate a task with notes", "add context to a task", "log progress on a task", "check task status", "list tasks", "show overdue tasks", "manage tasks with taskwarrior", or when any agent workflow requires recording work in the task ledger. Defines the default add→start→update→close lifecycle for AI agents executing tasks via the `task` CLI.
|
Task Workflow
Manage the full lifecycle of tasks using Taskwarrior — from capture through completion.
This skill defines the canonical workflow AI agents MUST follow when touching the task
ledger. Taskwarrior stores data in ~/.task/ by default; run all task commands via Bash.
Core Lifecycle: Add → Start → Update → Close
Every unit of work follows this four-stage lifecycle. Never skip stages silently.
Stage 1: Add (Capture)
Capture tasks immediately when work is identified. A task not in the ledger doesn't exist.
task add "Description of work" project:ProjectName
task add "Description of work" \
project:ProjectName.SubProject \
priority:H \
due:tomorrow \
+tag1 +tag2
Capture rules:
- Always assign a
project — unowned tasks decay
- Use
project:Parent.Child for sub-projects (e.g., project:Work.API)
- Set
priority:H/M/L only when it reflects real urgency — do not default to H
- Add
due: only when there is a real deadline
- Add
+ tags for cross-cutting concerns (+blocked, +waiting, +review)
- Translate natural language dates: "next Friday" →
due:friday, "end of month" → due:eom
Stage 2: Start (Activate)
Before executing any work, mark the task active. This creates an audit trail and exposes
blockers before time is spent.
task <id> info
task <id> start
Start rules:
- Always run
task <id> info before starting — annotations contain the full context
- Open every annotation that is a URL or file path before proceeding
- Only start one task at a time when possible (
task +ACTIVE list to check)
Stage 3: Update (Progress)
Log progress incrementally. Do not batch updates at the end — if execution is interrupted,
the ledger must reflect current state.
task <id> annotate "Progress: implemented X, pending Y"
task <id> annotate "Blocked: waiting for API key from team"
task <id> modify +blocked
task <id> annotate "https://github.com/user/repo/issues/42"
task <id> annotate "~/code/project/src/module.py"
task <id> annotate "obsidian://open?vault=<vault>&file=Projects/<slug>/notes.md"
task <id> modify due:eow
task <id> modify -blocked
Update rules:
- One annotation per resource or event — keeps each item individually removable
- Never batch multiple updates into one annotation
- If blocked mid-work: annotate the reason + add
+blocked before stopping
- If context becomes available (URL, file, note), annotate immediately
- See
references/obsidian-vault.md for Obsidian URI format
Stage 4: Close (Complete)
Close tasks immediately when work is done. Never leave a finished task pending.
task <id> done
task <id> stop
task <id> annotate "Partial: completed X. Remaining: Y"
Close rules:
- Call
task <id> done — this is non-negotiable; the task is not done until the ledger reflects it
- If completion is partial: stop the active timer, annotate remaining work, do NOT mark done
- After closing, show a brief summary of remaining tasks in the same project
Notes and Annotations
Annotations are the primary mechanism for attaching context — notes, URLs, file paths,
Obsidian links, GitHub issues. A task can carry unlimited annotations.
task 42 annotate "Spoke with vendor, waiting for quote"
task 42 annotate "obsidian://open?vault=<vault>&file=Projects/<slug>/meeting.md"
task 42 annotate "https://github.com/user/repo/issues/87"
task 42 annotate "~/code/src/validator.rs"
task 42 info
task 42 denotate "validator.rs"
For multiline notes and extended task descriptions, see references/examples.md.
Viewing Tasks
task next
task list
task <id> info
task +OVERDUE list
task +TODAY list
task +ACTIVE list
task project:Work list
bash ${CLAUDE_PLUGIN_ROOT}/skills/task-workflow/scripts/tw-summary.sh
Mandatory State Updates for AI Agents
Every time an AI agent completes, stalls, or is blocked on work, it MUST update Taskwarrior
before considering the turn done.
| Situation | Required action |
|---|
| Work completed | task <id> done |
| Work partially done | task <id> stop + annotate progress |
| Blocked | task <id> modify +blocked + annotate reason |
| Blocked resolved | task <id> modify -blocked + task <id> start |
| New resource found | task <id> annotate "<url or path>" |
| Timeline slipped | task <id> modify due:<new-date> |
Picking Up Existing Work
task +ACTIVE list
task <id> info
Modifying Tasks
task <id> modify priority:H
task <id> modify project:Work.Q4
task <id> modify due:tomorrow
task <id> modify +important -waiting
task <id> modify depends:<dep>
task <id> modify "Updated description"
Calendar Integration
To schedule work blocks or check availability before setting due:, use the task-calendar skill.
It bridges tasks with Google Calendar without modifying this workflow.
Additional Resources
references/best-practices.md — Taskwarrior best practices: project hierarchy, tagging, urgency, capture habits
references/examples.md — Multiline tasks, notes patterns, complex real-world examples
references/filters.md — Full filter syntax: operators, date math, virtual tags
references/advanced.md — Urgency tuning, UDAs, hook scripts, custom reports
references/obsidian-vault.md — Vault name, base path, PARA URI patterns
scripts/tw-summary.sh — Quick summary by project, overdue, and active tasks