Custom Statuses and Types

July 2, 2026 ยท View on GitHub

status and type are ordinary enum fields declared in workflow.yaml fields:. They have no special semantics in the runtime โ€” only the meaning you encode via the enum values you declare. This page covers the validation rules that apply to any enum field, with status and type as examples.

Configuration

YAML Shape

fields:
  - name: status
    type: enum
    values:
      - value: inbox
        label: Inbox
        visual: "๐Ÿ“ฅ"
        default: true
      - value: inProgress
        label: "In Progress"
        visual: "โš™๏ธ"
      - value: done
        label: Done
        visual: "โœ…"
  - name: type
    type: enum
    values:
      - value: story
        label: Story
        visual: "๐ŸŒ€"
        default: true
      - value: bug
        label: Bug
        visual: "๐Ÿ’ฅ"

Shared Rules

These rules apply to every enum field:

RuleDetail
Label defaults to valueWhen label is omitted, the value is used as the label.
Visual trimmedLeading/trailing whitespace is stripped from visual values.
Unique display stringsEach entry must produce a unique display string (its visual, or label when no visual). Duplicates are rejected.
At least one entryAn empty list is invalid.
Duplicate values rejectedTwo entries with the same value are invalid.
Unknown keys rejectedOnly documented metadata keys are allowed in each entry.
At most one default: trueThe default value is the creation default for the field.

Valid keys in an enum value entry: value, label, visual, default.

The legacy emoji:, active:, and done: keys on enum values are no longer accepted โ€” emoji: was renamed to visual:, and active:/done: were status-specific concepts the runtime no longer recognizes. If you want a visual cue for "in-progress" or "terminal" states, use the visual: field on each value (e.g. โœ… on the value that represents completion). visual: accepts a glyph or <role>-tagged color markup.

Required Sections

status and type are not built-in. If a workflow declares them in fields:, they behave like any other enum field. If your workflow doesn't declare them, no status or type semantics exist for that workflow โ€” frontmatter values for those keys round-trip as unknown.

All workflow-backed sections come from the single highest-priority workflow.yaml. See Configuration: Precedence.

Failure Behavior

Invalid Configuration

ScenarioBehavior
Empty listError
Empty/whitespace labelError
Duplicate display stringError
Unknown metadata key in entry (e.g. active: / done:)Error with migration message
Multiple default: trueError

Invalid Saved Tasks

  • An enum value not declared in workflow.yaml is demoted to "stale" on load and round-trips verbatim, so the user can see the bad value and fix it manually rather than silently lose it.
  • Save-time validation (the mutation gate) rejects writes whose enum values don't match the declared set.

Cross-Reference Errors

If the active workflow file defines values that don't match the views, actions, or triggers in the same file, startup fails with a configuration error. There is no silent view-skipping or automatic remapping.

Pre-Init Rules

Enum values resolve through the field catalog, which is populated by config.LoadWorkflowFields(). Before that call the catalog is empty: enum lookups fall back to "no enum field configured" semantics (empty/zero values) rather than panicking, and config.RequireWorkflowFieldsLoaded() reports the not-yet-loaded state for code paths that must not run before the catalog is ready.