Task System
A lightweight, static, file-based task management system embedded in the repository. Tasks are permanent history — once created, never deleted. No database, no server, no internet.
This is separate from runtime/ephemeral task tools. Those disappear when the session ends. This task system lives in the repo. Its tasks are kept forever.
Core Philosophy
- Static, file-based, in-repo — Three files in
.agents/tasks/: inbox.md, tasks.yaml, closed.yaml. No database, no service, no setup beyond tasks init.
- Tasks are permanent history — Nothing is ever deleted. Tasks flow from
tasks.yaml (active) to closed.yaml (archive).
- 12 statuses, any lifecycle —
todo, in-progress, done, blocked, postponed, cancelled, review, waiting, parked, deferred, backlog, abandoned. Move freely between them.
- Counter-based IDs — Tasks get
TSK-NNNN IDs (e.g. TSK-0001). Auto-incrementing.
- Numeric priorities (p0-p4) —
p0 (critical) > p4 (backlog). Named aliases also work.
- Dependency system — Typed deps (
blocks, parent, child, discovered, relates). blocks affects the ready queue.
- Newest-first ordering in active list, oldest-first in archive.
⚠️ Golden Rule: YAML files are CLI-only. Inbox.md is free-form.
| File |
Who edits it |
How |
tasks.yaml |
Never by hand |
CLI only (tasks add, tasks update, tasks close) |
closed.yaml |
Never by hand |
CLI only (tasks close appends automatically) |
inbox.md |
Anyone, any time |
Free-form text — humans dump ideas, agents paste notes, raw scraps live here |
File Layout
<project-root>/
.agents/tasks/
inbox.md # Raw dump zone — paste ideas, notes, scraps here
tasks.yaml # Active task list (any status, closed=false)
closed.yaml # Closed task archive (append-only, permanent)
All files are self-documenting — open any YAML file and the header explains the system.
Statuses
| Status |
Meaning |
Typical next step |
todo |
Needs to be done |
in-progress |
in-progress |
Being actively worked on |
done, blocked, review |
done |
Complete (moves to archive) |
— |
blocked |
Cannot proceed — waiting on external dependency |
waiting, todo |
postponed |
Pushed to later — not blocked, just delayed |
todo, backlog |
cancelled |
Will not be done |
— |
review |
Needs review or approval |
done, todo, in-progress |
waiting |
Waiting on someone else |
todo, review |
parked |
Set aside, may come back |
todo, backlog |
deferred |
Deliberately delayed to a known future time |
todo, in-progress |
backlog |
Lower-priority, no current intent to start |
todo, parked |
abandoned |
Started but permanently abandoned |
— |
Quick Start
# Bootstrap
tasks init
# Create tasks
tasks add "Refactor auth middleware" --priority p1 --tag refactor
tasks add "Fix login bug" --tag bug --tag security --priority p0
tasks add "Write tests" --dep TSK-0003:blocks --notes "Must cover edge cases"
tasks add "Related docs" --related TSK-0005
# Start working
tasks take TSK-0001
tasks update TSK-0001 --status blocked --notes "Waiting on API key from IT"
tasks update TSK-0001 --status in-progress # unblocked
# Review and close
tasks close TSK-0001 --note "Deployed to prod, monitors green"
# Session check-in
tasks status # counts by status, inbox line count
tasks ready # what's actionable right now
tasks blocked # what's stuck and why
tasks next --take 3 # priority queue
How to Operate
Starting a Session
# 1. Check what's pending
tasks status
# 2. See what's unblocked and actionable
tasks ready
# 3. Or see full queue (including blocked)
tasks next --take all
# 4. Check for blockers if things feel stuck
tasks blocked
Inbox Processing — The Most Important Workflow
Turn raw notes into structured tasks, then leave the inbox empty. This is the ingress pipeline — the gateway where vague ideas become delegatable work.
# 1. Read everything in the inbox — don't skip items
tasks inbox
# 2. Draft tasks for every actionable item
# For each item, ask: "Is this clear enough to execute without further input?"
# If unclear → ask the user clarifying questions BEFORE creating the task
# If clear → draft with title, notes, priority, tags
tasks add "Fix login timeout on mobile" --source inbox --priority high --tag bug --notes "Must reproduce on iOS Safari and Android Chrome"
tasks add "Update README with API examples" --source inbox --priority low --tag docs --notes "Add curl examples for all 5 endpoints"
# 3. Present the draft tasks to the user for confirmation
# "I understood your inbox as 4 tasks. Here's what I'll create: [...] Proceed?"
# Only create tasks after explicit confirmation.
# 4. Clear the inbox completely — leave it empty
echo. > .agents/tasks/inbox.md # Windows: wipe to blank
# > .agents/tasks/inbox.md # Unix: wipe to blank
Ingress Rules:
- Take ALL items, not just the easy ones
- Ask clarifying questions when an item is vague. If the user chooses not to answer, create the task anyway with whatever context is available — the user owns the task, not you.
- Get confirmation before creating tasks and wiping the file
- After processing, the inbox must be empty — not partially cleaned, not annotated, not "organized." Empty.
- If an item is unclear and the user is unavailable, leave it in the inbox and process what you can
Default behavior: Wipe the inbox clean after processing. Only skip if the user explicitly says to keep it. When in doubt, empty it.
Tracking Progress
# Start working
tasks update TSK-0004 --status in-progress
# Hit a blocker — mark it
tasks update TSK-0004 --status blocked --notes "Waiting on API key from IT"
tasks update TSK-0004 --dep TSK-0010:blocks # record what's blocking it
# Later: unblocked
tasks update TSK-0004 --status in-progress
# Needs review before shipping
tasks update TSK-0004 --status review
# Priority changed — push it to later
tasks update TSK-0004 --status postponed --priority p3
# Put it in the backlog for future triage
tasks update TSK-0004 --status backlog
# Something came up — change priority, add context
tasks update TSK-0004 --priority p0 --notes "Client escalation, needs immediate attention"
# Cancelled — no longer relevant
tasks update TSK-0004 --status cancelled --notes "Requirement dropped"
# Close it — could be cancelled, abandoned, or finished
tasks close TSK-0004 --note "Deployed to prod, monitors green"
Moving Between Statuses
No restrictions on status transitions. You can move a task from any status to any other:
# Direct skip: backlog → done
tasks update TSK-0010 --status done
# Backwards: review → todo (more work needed)
tasks update TSK-0011 --status todo --notes "Review found issues, needs rework"
# Dead end: in-progress → abandoned
tasks update TSK-0012 --status abandoned --notes "Proof of concept failed"
The only special status is done — use tasks close TSK-NNNN to move it to the archive.
Use tasks update TSK-NNNN --status done only when backdating or correcting a closed task's status.
Reviewing
# What's on the plate
tasks list --status todo
# What's been accomplished
tasks history --json
# Full session overview
tasks status
Examples
# Create a task with rich metadata
tasks add "Proof trail" --evidence "file: src/agent_sommelier/tasks/core.py"
# Task with dependency blocking another
tasks add "Deploy to production" --dep TSK-0007:blocks --priority p0
# Start working, claim it
tasks take TSK-0001 --claimed rx
tasks claim TSK-0001 --claimed rx
# Multi-dimensional tagging — don't just tag one thing
tasks add "Fix race condition in auth" --tag bug --tag auth --tag security --tag autonomous-ready
# From a detailed inbox note
tasks add "Implement rate limiting" --source inbox --priority medium --notes "See inbox.md for requirements"
# Change everything at once
tasks update TSK-0004 --status postponed --priority p3 --notes "Client deprioritized this"
Dependency graph example
# Create tasks with chains
tasks add "Design API"
tasks add "Implement API" --dep TSK-0001:blocks
tasks add "Test API" --dep TSK-0002:blocks
tasks add "Deploy API" --dep TSK-0003:blocks
# View the chain
tasks deps TSK-0004
# → TSK-0001 (blocks) → TSK-0002 (blocks) → TSK-0003 (blocks) → TSK-0004
When to Use This Skill
Use the task system proactively — not just when asked:
- Session start:
tasks status + tasks ready to orient
- When you discover work:
tasks add "..." --tag type --tag area
- When context shifts:
tasks update TSK-NNNN --status ...
- When you complete work:
tasks close TSK-NNNN --note "..."
- When the inbox has items: Read → draft → confirm → wipe clean
- Before significant changes: Check what's in-progress
- When priorities need review:
tasks next --take all
- When exploring relationships:
tasks deps TSK-NNNN
When NOT to use it
- Don't create duplicates of tasks already in the system
- Never edit
tasks.yaml or closed.yaml by hand — always use the CLI
- Inbox.md IS the exception — edit it freely. It is a scratch file.
- Don't delete tasks — they're permanent history. Close them instead.
- Don't use for ephemeral runtime tracking (use
crony, bg-jobs, or runtime tools for that).
Deeper Reading
| Topic |
File |
| Full CLI reference (all commands, flags, option tables) |
references/cli.md |
1---2name: task-system3description: Use this skill when you need to manage project tasks — create, update, complete, prioritize, filter, review, track dependencies, or find unblocked work. Trigger on: 'add a task', 'create task', 'show tasks', 'what's next', 'mark done', 'update task', 'task status', 'task history', 'next task', 'task inbox', 'list tasks', 'init tasks', 'task deps', 'ready tasks', 'blocked tasks', 'search tasks', 'tag-any', 'dependency graph'. Also use proactively when starting a new work session — check `tasks status` and `tasks ready` to orient yourself. This skill covers the project's static, file-based task system (persistent, in-repo history) with typed dependency tracking, ready queue, and priority management — NOT ephemeral runtime task tools.4---56# Task System78A lightweight, **static, file-based task management system** embedded in the repository. Tasks are permanent history — once created, never deleted. No database, no server, no internet.910**This is separate from runtime/ephemeral task tools.** Those disappear when the session ends. This task system lives in the repo. Its tasks are kept forever.1112---1314## Core Philosophy1516- **Static, file-based, in-repo** — Three files in `.agents/tasks/`: `inbox.md`, `tasks.yaml`, `closed.yaml`. No database, no service, no setup beyond `tasks init`.17- **Tasks are permanent history** — Nothing is ever deleted. Tasks flow from `tasks.yaml` (active) to `closed.yaml` (archive).18- **12 statuses, any lifecycle** — `todo`, `in-progress`, `done`, `blocked`, `postponed`, `cancelled`, `review`, `waiting`, `parked`, `deferred`, `backlog`, `abandoned`. Move freely between them.19- **Counter-based IDs** — Tasks get `TSK-NNNN` IDs (e.g. `TSK-0001`). Auto-incrementing.20- **Numeric priorities (p0-p4)** — `p0` (critical) > `p4` (backlog). Named aliases also work.21- **Dependency system** — Typed deps (`blocks`, `parent`, `child`, `discovered`, `relates`). `blocks` affects the ready queue.22- **Newest-first** ordering in active list, oldest-first in archive.2324### ⚠️ Golden Rule: YAML files are CLI-only. Inbox.md is free-form.2526| File | Who edits it | How |27|------|-------------|-----|28| `tasks.yaml` | **Never by hand** | CLI only (`tasks add`, `tasks update`, `tasks close`) |29| `closed.yaml` | **Never by hand** | CLI only (`tasks close` appends automatically) |30| `inbox.md` | **Anyone, any time** | Free-form text — humans dump ideas, agents paste notes, raw scraps live here |3132---3334## File Layout3536```37<project-root>/38 .agents/tasks/39 inbox.md # Raw dump zone — paste ideas, notes, scraps here40 tasks.yaml # Active task list (any status, closed=false)41 closed.yaml # Closed task archive (append-only, permanent)42```4344All files are self-documenting — open any YAML file and the header explains the system.4546---4748## Statuses4950| Status | Meaning | Typical next step |51|--------|---------|-------------------|52| `todo` | Needs to be done | `in-progress` |53| `in-progress` | Being actively worked on | `done`, `blocked`, `review` |54| `done` | Complete (moves to archive) | — |55| `blocked` | Cannot proceed — waiting on external dependency | `waiting`, `todo` |56| `postponed` | Pushed to later — not blocked, just delayed | `todo`, `backlog` |57| `cancelled` | Will not be done | — |58| `review` | Needs review or approval | `done`, `todo`, `in-progress` |59| `waiting` | Waiting on someone else | `todo`, `review` |60| `parked` | Set aside, may come back | `todo`, `backlog` |61| `deferred` | Deliberately delayed to a known future time | `todo`, `in-progress` |62| `backlog` | Lower-priority, no current intent to start | `todo`, `parked` |63| `abandoned` | Started but permanently abandoned | — |6465---6667## Quick Start6869```bash70# Bootstrap71tasks init7273# Create tasks74tasks add "Refactor auth middleware" --priority p1 --tag refactor75tasks add "Fix login bug" --tag bug --tag security --priority p076tasks add "Write tests" --dep TSK-0003:blocks --notes "Must cover edge cases"77tasks add "Related docs" --related TSK-00057879# Start working80tasks take TSK-000181tasks update TSK-0001 --status blocked --notes "Waiting on API key from IT"82tasks update TSK-0001 --status in-progress # unblocked8384# Review and close85tasks close TSK-0001 --note "Deployed to prod, monitors green"8687# Session check-in88tasks status # counts by status, inbox line count89tasks ready # what's actionable right now90tasks blocked # what's stuck and why91tasks next --take 3 # priority queue92```9394---9596## How to Operate9798### Starting a Session99100```bash101# 1. Check what's pending102tasks status103104# 2. See what's unblocked and actionable105tasks ready106107# 3. Or see full queue (including blocked)108tasks next --take all109110# 4. Check for blockers if things feel stuck111tasks blocked112```113114### Inbox Processing — The Most Important Workflow115116Turn raw notes into structured tasks, then leave the inbox empty. This is the **ingress pipeline** — the gateway where vague ideas become delegatable work.117118```bash119# 1. Read everything in the inbox — don't skip items120tasks inbox121122# 2. Draft tasks for every actionable item123# For each item, ask: "Is this clear enough to execute without further input?"124# If unclear → ask the user clarifying questions BEFORE creating the task125# If clear → draft with title, notes, priority, tags126127tasks add "Fix login timeout on mobile" --source inbox --priority high --tag bug --notes "Must reproduce on iOS Safari and Android Chrome"128tasks add "Update README with API examples" --source inbox --priority low --tag docs --notes "Add curl examples for all 5 endpoints"129130# 3. Present the draft tasks to the user for confirmation131# "I understood your inbox as 4 tasks. Here's what I'll create: [...] Proceed?"132# Only create tasks after explicit confirmation.133134# 4. Clear the inbox completely — leave it empty135echo. > .agents/tasks/inbox.md # Windows: wipe to blank136# > .agents/tasks/inbox.md # Unix: wipe to blank137```138139**Ingress Rules:**140- **Take ALL items**, not just the easy ones141- **Ask clarifying questions** when an item is vague. If the user chooses not to answer, create the task anyway with whatever context is available — the user owns the task, not you.142- **Get confirmation** before creating tasks and wiping the file143- After processing, the inbox must be **empty** — not partially cleaned, not annotated, not "organized." Empty.144- If an item is unclear and the user is unavailable, **leave it in the inbox** and process what you can145146> **Default behavior:** Wipe the inbox clean after processing. Only skip if the user explicitly says to keep it. When in doubt, empty it.147148### Tracking Progress149150```bash151# Start working152tasks update TSK-0004 --status in-progress153154# Hit a blocker — mark it155tasks update TSK-0004 --status blocked --notes "Waiting on API key from IT"156tasks update TSK-0004 --dep TSK-0010:blocks # record what's blocking it157# Later: unblocked158tasks update TSK-0004 --status in-progress159160# Needs review before shipping161tasks update TSK-0004 --status review162163# Priority changed — push it to later164tasks update TSK-0004 --status postponed --priority p3165166# Put it in the backlog for future triage167tasks update TSK-0004 --status backlog168169# Something came up — change priority, add context170tasks update TSK-0004 --priority p0 --notes "Client escalation, needs immediate attention"171172# Cancelled — no longer relevant173tasks update TSK-0004 --status cancelled --notes "Requirement dropped"174175# Close it — could be cancelled, abandoned, or finished176tasks close TSK-0004 --note "Deployed to prod, monitors green"177```178179### Moving Between Statuses180181No restrictions on status transitions. You can move a task from any status to any other:182183```bash184# Direct skip: backlog → done185tasks update TSK-0010 --status done186187# Backwards: review → todo (more work needed)188tasks update TSK-0011 --status todo --notes "Review found issues, needs rework"189190# Dead end: in-progress → abandoned191tasks update TSK-0012 --status abandoned --notes "Proof of concept failed"192```193194The only special status is `done` — use `tasks close TSK-NNNN` to move it to the archive.195Use `tasks update TSK-NNNN --status done` only when backdating or correcting a closed task's status.196197### Reviewing198199```bash200# What's on the plate201tasks list --status todo202203# What's been accomplished204tasks history --json205206# Full session overview207tasks status208```209210---211212## Examples213214```bash215# Create a task with rich metadata216tasks add "Proof trail" --evidence "file: src/agent_sommelier/tasks/core.py"217218# Task with dependency blocking another219tasks add "Deploy to production" --dep TSK-0007:blocks --priority p0220221# Start working, claim it222tasks take TSK-0001 --claimed rx223tasks claim TSK-0001 --claimed rx224225# Multi-dimensional tagging — don't just tag one thing226tasks add "Fix race condition in auth" --tag bug --tag auth --tag security --tag autonomous-ready227228# From a detailed inbox note229tasks add "Implement rate limiting" --source inbox --priority medium --notes "See inbox.md for requirements"230231# Change everything at once232tasks update TSK-0004 --status postponed --priority p3 --notes "Client deprioritized this"233```234235### Dependency graph example236```bash237# Create tasks with chains238tasks add "Design API"239tasks add "Implement API" --dep TSK-0001:blocks240tasks add "Test API" --dep TSK-0002:blocks241tasks add "Deploy API" --dep TSK-0003:blocks242243# View the chain244tasks deps TSK-0004245# → TSK-0001 (blocks) → TSK-0002 (blocks) → TSK-0003 (blocks) → TSK-0004246```247248---249250## When to Use This Skill251252Use the task system **proactively** — not just when asked:253254- **Session start**: `tasks status` + `tasks ready` to orient255- **When you discover work**: `tasks add "..." --tag type --tag area`256- **When context shifts**: `tasks update TSK-NNNN --status ...`257- **When you complete work**: `tasks close TSK-NNNN --note "..."`258- **When the inbox has items**: Read → draft → confirm → wipe clean259- **Before significant changes**: Check what's in-progress260- **When priorities need review**: `tasks next --take all`261- **When exploring relationships**: `tasks deps TSK-NNNN`262263### When NOT to use it264- Don't create duplicates of tasks already in the system265- **Never edit `tasks.yaml` or `closed.yaml` by hand** — always use the CLI266- **Inbox.md IS the exception** — edit it freely. It is a scratch file.267- Don't delete tasks — they're permanent history. Close them instead.268- Don't use for ephemeral runtime tracking (use `crony`, `bg-jobs`, or runtime tools for that).269270---271272## Deeper Reading273274| Topic | File |275|---|---|276| Full CLI reference (all commands, flags, option tables) | [`references/cli.md`](references/cli.md) |