SKILL.md
Tasks — per-task context, cost, and execution state
A task is a named unit of work. While a task is active, the tokens the session spends are attributed to it, so the Control Center (/cco) can show cost per task, not just per session.
Each task also carries a small JSON execution state — goal, what is done, what is open, the next action. You update it with patches instead of re-deriving progress from the transcript, it is capped at ~1K tokens so it never grows with the number of steps, and it is re-injected verbatim right after /compact (and on --resume). That is the SKILL.state idea (Google / Purdue,
- applied where a plugin can apply it: the compaction summary is lossy and
free-form; the state is exact and bounded.
Commands
Parse the user's argument and run the matching command (working directory scopes the tasks to the current project):
Start / switch task (also closes the previous active task):
node ${CLAUDE_PLUGIN_ROOT}/src/tasks.js add "<task name>"
After starting, suggest packing the minimal context for it: /cco-pack "<task name>", and seed the state with the goal and the plan: /cco-task patch '{"goal": "...", "plan": ["...", "..."], "next": "..."}'.
Patch the execution state (set keys; null deletes a key):
node ${CLAUDE_PLUGIN_ROOT}/src/tasks.js patch '{"done": ["read auth.ts"], "next": "write the failing test", "scratch": null}'
The patch must be a JSON object. If the state would exceed the cap the patch is rejected — prune finished keys with null first.
Show the current state:
node ${CLAUDE_PLUGIN_ROOT}/src/tasks.js state
List tasks (newest first, with per-task tokens + $):
node ${CLAUDE_PLUGIN_ROOT}/src/tasks.js list
Complete the active task:
node ${CLAUDE_PLUGIN_ROOT}/src/tasks.js done
State discipline (what makes it worth keeping)
- Keep it a state, not a log:
done,open,next,decisions,files—
facts needed to continue, not the history of how you got there. Reasoning is ephemeral; the state is what survives.
- Patch after each milestone (a test passing, a decision made, a file finished),
and delete keys the moment they stop mattering.
- After
/compactthe SessionStart hook prints the active task's state into the
new context automatically — treat it as authoritative over the summary.
- When delegating to a subagent, pass the state (not the conversation) as the
brief; it is already the minimal, current description of the task.
Flow to recommend
/cco-task add "implement X"— start the task/cco-pack "implement X"— load only the files that task needs/cco-task patch '{"goal": "...", "next": "..."}'— seed the state; patch as you go/cco— see budget, savings, and this task's cost/cco-task done— freeze the task's token/$ total
Only one task is active per project at a time; starting a new one finalizes the previous task's cost automatically.