← All docs

Workflows — how a story's lifecycle is chosen

A workflow is a story's lifecycle: the states it moves through and the reviewer that gates each edge, authored in DOT under .satelle/workflows. satelle does not hardcode a lifecycle — the operator authors it as substrate, and satelle enforces it.

The ideal: one governing workflow per story type

A workflow declares, in its frontmatter, what it governs and its purpose:

applies_to: ["feature"]      # the story categories this workflow governs ("*" = any)
description: ...             # what this lifecycle is for — read by the agent
create_review: my-rubric    # (optional) the content/alignment reviewer for `story create`

The ideal is one workflow per category. Selection is then unambiguous and deterministic.

Multiple candidates → the agent chooses by content

A repo MAY have more than one workflow that could apply (e.g. a category-specific one and a wildcard). satelle resolves a single active workflow by precedence — a category-specific match beats a wildcard, and a repo workflow beats the embedded default. To see the candidates and their purpose for a story's category:

satelle workflow list --category <category>

The head of that list is the active choice. When several genuinely fit, the agent picks by the story's content and records the choice by adding a workflow:<name> tag at create (otherwise satelle stamps the resolved active one automatically).

The choice is stamped and stable

At create, the governing workflow is stamped on the story — a workflow:<name> tag plus a workflow_stamped ledger entry. Every gate thereafter reads the stamped workflow, not a freshly re-derived one, so a story's lifecycle is fixed once it begins (deterministic after create).

Avoiding misconfiguration

Flexibility is not a licence to over-configure. satelle workflow validate flags inconsistencies the operator should fix, and the agent should advise on them:

  • Ambiguous applies_to — two repo workflows that claim the same category (or the wildcard) at the same precedence, so the tiebreak is arbitrary.
  • An unresolved reviewer skill — a workflow names a gate (reviewer_skill= or an @skill: node) that does not resolve in the substrate.

Run satelle workflow validate to surface these before they bite.


Mirrored from satelle’s built-in help. Read it in the binary with satelle help workflows, or see the canonical source in the satelle repo.