statuses.yaml is the single source of truth for status identity in a project. Every workflow references these entries by id and inherits their name and category; workflows may pick a subset but cannot reorder or rename them. Declaration order here is the canonical left-to-right column order on the board's all-workflows view.

Where it lives

<config-root>/workflows/statuses.yaml

<config-root> is ~/.shelbi/projects/<name>/ in the default global mode and <repo>/.shelbi/ in in-repo mode, the same directory as the workflow files.

Editing from Settings

You don't have to edit the file by hand. Settings ▸ Workflows, in the desktop app and in the TUI (press , in the sidebar, then 4), lists the catalog with the workflows that use each status. From there you can add a status, rename it (its id never changes, so workflows keep pointing at it), change its category, reorder it, and delete one no workflow uses. Each change is saved to this file as you make it, comments and unknown keys included, and Edit YAML opens the file itself. If the file changed on disk since the page read it, nothing is written: the page reloads and says so.

Example

# ~/.shelbi/projects/myapp/workflows/statuses.yaml
statuses:
  - { id: backlog,     name: Backlog,     category: backlog }
  - { id: todo,        name: Todo,        category: ready }
  - { id: in-progress, name: In Progress, category: active }
  - { id: review,      name: Review,      category: handoff }
  - { id: done,        name: Done,        category: done }
  - { id: canceled,    name: Canceled,    category: archived }

Top-level fields

FieldTypeRequiredDefaultDescription
statuseslist of Statusyes—Ordered catalog of every status in the project. Order is significant: it's the column order on the board's all-workflows view.

status

FieldTypeRequiredDefaultDescription
idstringyes—Stable identifier referenced from every workflow's statuses: list. Must be unique and non-empty. Conventionally lowercase kebab-case.
namestringyes—User-facing display label (e.g. Backlog, In Progress). Must be non-empty.
categorycategoryyes—Closed semantic category. Generic code keys off this, so a renamed status keeps its behavior.

categories

The category field is a closed vocabulary of exactly six values: generic code (the orchestrator, Zen Mode, event-log reactions) keys off the category, not the display name, so renaming a status leaves its semantics intact. See status categories.

CategoryMeaning
backlogNot yet ready for work — triage stage.
readyReady to be picked up by whoever owns it.
activeOwner is working on it now.
handoffOne owner finished their part; another's input is required next.
doneTerminal — accepted, shipped.
archivedTerminal — closed without shipping (cancelled, won't fix, duplicate).

At least one terminal category

Loading fails if no status has category done or archived. A board with no terminal state is degenerate, since a task could never leave it. Beyond that, the terminal categories done and archived may repeat cleanly (a pipeline can carry several done-like or archived-like lanes). The single-instance categories (backlog, ready, and handoff) raise a non-fatal warning if any of them appears more than once, as does a missing handoff. active may repeat freely: a second active status is how you add an agent gate (for example adversarial-review) before review, and it loads with no warning.

See also

  • Workflows — how workflows reference these statuses and the category model in depth.
  • Workflow config — the reference-only status form that pairs with this catalog.