Operation fields
An operation contains exactly these fields:service: The owning service.description: Documentation only; no proof semantics.inputs: Possible invocation sources. See the three input kinds below.program: The single explicit causal control structure.requirements: Proof obligations the verifier must discharge.
Three input kinds
Request input
A request input declares a directly invoked operation input and the schema of its payload.identity declares where the identity of one logical request lives in the payload. keyed guarantees that any two requests whose identity field values are equal present equal payloads. unspecified provides no such fact.
result declares the Result<Ok, Err> contract returned by this input. disposition is terminal, retryable, or unspecified.
Subscription input
A subscription declares invocation from a topic.delivery or dispatch; those are L1 facts declared in a SubscriptionRuntime.
Outbox input
An outbox input declares invocation from a committed outbox message.acknowledge_on_success declaration. Like subscriptions, it carries no delivery or dispatch facts; those live in an OutboxRuntime.
The program
operation.program is the operation’s single control structure: a block of steps executed in order, with match_result and branch decisions nesting further blocks. Every reachable path ends at return (for a request input) or complete (returning nothing).
The structure is acyclic by construction: no loops exist. Asynchronous effect steps may initiate effect executions whose lifetimes overlap later control, and join_all / race add explicit completion dependencies, but the operation remains a control-flow DAG plus effect-completion edges.
Control flow describes causality. It is not a durable workflow, a checkpoint, or a program counter: a retry traverses the same declared control from the first step, and what it re-encounters is judged by transaction and effect replay rules.
For details on async effect steps and synchronization, see Async effects. For the full program step vocabulary, see Program control.
Stable execution-site IDs versus bindings
Two kinds of names arise from inline declarations, and they are not the same thing. Stable execution-site IDs identify the inline declaration itself:Transaction.idExecuteEffect.effect_idEstablishEffectIntent.effect_id
- a transaction read observation
- a transaction output artifact
- an effect-intent artifact
- an effect result observation
- an async handle
effect_id, the stable identity of the inline effect occurrence, and handle, an invocation-local synchronization artifact naming one asynchronous execution occurrence.
Compact example
- The transaction writes an outbox message and establishes a transaction output.
- The program publishes to a topic using the transaction output for provenance.
- The operation returns an
Okresult constructed from the transaction output.