Status
Status values
Every issue moves through a simple lifecycle:
BACKLOG → PLANNED → DOING → DONE
↘ BLOCKED ↗
| Status | Meaning |
|---|---|
BACKLOG | Captured but not yet spec'd or prioritized |
PLANNED | Spec'd and ready for work |
DOING | Actively in progress |
BLOCKED | Stuck on something |
DONE | Shipped |
Transition commands
xpo planned <id> # → PLANNED
xpo start <id> # → DOING (creates a branch)
xpo blocked <id> # → BLOCKED
xpo done <id> # → DONE
Or set status directly:
xpo update <id> --status PLANNED
Branching
xpo start does two things: sets the status to DOING and creates a git branch named after the issue. You're switched to the new branch automatically.
xpo start <id> # creates branch + switches
xpo start <id> --force # take over existing branch
Merging
When the work is done, merge the branch back and close the issue in one step:
xpo merge <id> # squash-merge + close
xpo merge <id> --ff # fast-forward only
xpo merge <id> --keep-branch # don't delete the branch
Review the diff before merging:
xpo review <id>
Blocked issues
An issue with blocked_by relationships cannot move to DOING until all blockers are DONE. See Relationships for details.
Status cascading
Status changes can cascade between parent and child issues through automations — for example, completing all children automatically completes the parent. See Parent & Sub-Issues for details.
In the web board
Drag issues between status columns to transition them. The board view shows issues grouped by status in a Kanban layout.