Skip to content

ADR-006: Command Categories ​

Status ​

Accepted

Context ​

  • Problem: Commands have implicit semantic categories that affect how runners must handle them, but this is not documented
  • Why now: Helper functions (isControlCommand, isBlockingCommand, isSideEffectCommand) were added in #9, formalizing the categories
  • Constraints: Categories must align with existing command semantics and runner contracts

Decision ​

  • Chosen option: Document three command categories with distinct behaviors
  • Rationale:
    • Makes implicit semantics explicit for implementers
    • Guides correct runner implementation
    • Helps users reason about command effects

Categories ​

CategoryCommandsBehaviorHelper
Controlinvoke, fanoutDispatch execution to other stepsisControlCommand()
Barrierreview, suspendBlock until external input resolvesisBlockingCommand()
EffectemitProduce side effects, not replayedisSideEffectCommand()

Control Commands ​

Dispatch execution to other steps. The runner schedules the target step(s) for execution.

  • invoke: Single step execution with given input
  • fanout: Multiple parallel executions of the same step with different inputs

Control commands do not block the current step's completion.

Barrier Commands ​

Block workflow execution until external input arrives. The runner must persist the suspension and resume when the barrier resolves.

  • review: Human approval gate. Sibling commands are deferred until review resolves.
  • suspend: Wait for external data/callback. Sibling commands are discarded – the resumed step emits new commands.

Both require the runner to persist state for later resumption.

Effect Commands ​

Produce side effects to external systems. Not replayed during recomputation.

  • emit: Publish domain event to external topic/queue

Effect commands are fire-and-forget from the step's perspective.

Alternatives ​

  • No formal categories: Leaves semantics implicit, harder for implementers
  • Per-command documentation only: Misses the grouping insight
  • More granular categories: Over-complicates for current command set

Consequences ​

  • Positive: Clear contract for runner implementations; easier reasoning about command effects
  • Negative: None – documentation only
  • Follow-ups: Consider category-specific validation in future runner implementations

LLM context: llms.txt · llms-full.txt
Released under the Apache 2.0 License.