# Work Track

> Track work items — use when creating, updating, closing, or listing work items, or when discovering unplanned work mid-flight ("we also need to…", a bug found while doing something else).

- Skill: `spillwavesolutions/work-track` (Agent Skill)
- Install (CLI): `npx skillmds@latest add spillwavesolutions/work-track`
- Raw SKILL.md: https://api.skillmd.com/api/skills/spillwavesolutions/work-track/raw
- Safety review: pending
- Works with: Claude Code, Claude.ai, OpenAI Codex
- Category: Coding & Dev Tools
- Author: spillwavesolutions (https://skillmd.com/u/spillwavesolutions)
- Updated: 2026-09-17
- Page: https://skillmd.com/skills/spillwavesolutions/work-track

---


# Work tracking

Every request that produces work gets worklog items FIRST — add them before
starting, move them `in_progress` → `done` as the work happens (the
UserPromptSubmit and Stop hooks enforce this). Unrecorded work is invisible work.

All state changes go through `bin/worklog`. Never edit `.work/*.jsonl` by
hand or with shell redirects (invariant 15.4) — the CLI's `append()` is the
only writer.

## Add an item

    bin/worklog add "<title>" --body "<readable description>" \
        [--level epic|story|task|subtask] \
        [--kind feature|bug|ops|triage] [--milestone v0.6.0] \
        [--priority P0-P3] [--parent <ulid>] [--labels a,b]

**Every item gets a `--body` (spec §13.4).** One to three sentences a junior
dev or a PM can read in the ticket: what the work is and why it matters. No
ULIDs, no repo jargon in the reading path — the sync marker carries
provenance, the body carries meaning. A ticket whose body is only a worklog
id is a policy violation. Fix gaps with `worklog update <ulid> --body "..."`.

Taxonomy rules (spec 5.4): epics are `feature` or `ops` only — kind is free
at story/task/subtask; bugs may float free of any epic (`--parent` optional).
`--milestone` goes on leaves (story and below); an epic's milestone derives
from its children. Unclassified work defaults to `kind:triage` — classify
deliberately, don't guess. `--type` is a deprecated alias (`bug` →
`task`/`bug`); prefer `--level`/`--kind`.

## Unplanned discoveries

Work discovered mid-flight ("we also need to…", a bug found while doing
something else) MUST be recorded BEFORE doing the work:

    bin/worklog add "<title>" --unplanned --discovered-during <current-item-ulid>

`--unplanned` requires `--discovered-during` (spec 5.4).

## Update / close

    bin/worklog update <ulid> [--status todo|in_progress|blocked] \
        [--kind feature|bug|ops|triage] [--milestone v0.6.0] \
        [--priority P0-P3] [--add-label a] [--del-label b]
    bin/worklog close <ulid> --status done|cancelled [--resolution "..."]

After closing items, run the ticket-sync skill so linked tickets close
remotely too.

## Inspect

    bin/worklog list          # open items
    bin/worklog list --all    # includes closed
    bin/worklog show <id-prefix>

## After any change

Run `bin/worklog roadmap-render` and commit the log and roadmap together
(`.work/todo.jsonl` + `docs/roadmap.md`) — the pre-commit hook rejects a
stale roadmap.

## After merging branches

The logs union-merge without conflict, but `docs/roadmap.md` may conflict or
go stale (both sides regenerated it). Recovery is always the same: run
`bin/worklog roadmap-render`, `git add -A`, and finish the merge commit. The
pre-merge-commit hook blocks any merge that would land a stale roadmap.

