Await Unit Runtime ​
Await units are the durable suspend/resume model for kind: await steps. The unit is the interaction boundary TPF owns: it records what was dispatched, what completion is required, and what payload should be replayed when the owning execution resumes.
This guide is implementation-facing. Application-facing usage lives in Await Boundaries.
Guide Pages ​
- Model explains the durable records and cardinality semantics.
- Sequences shows unary, stream, aggregate, timeout, and resume flows.
- Patterns explains the architectural patterns and why the unit model fixed the design.
- Limitations And Debt tracks implementation limitations and follow-up work.
Core Model ​
The key split is:
AwaitUnitRecord: one durable interaction unit for an authored await step at a specific execution and step index.AwaitInteractionRecord: one externally visible interaction that can be queried, dispatched, completed, timed out, or correlated by transport.ExecutionRecord.awaitUnitId: the parked continuation pointer used while the execution isWAITING_EXTERNAL.
AwaitUnitRecord is the source of truth for completion of the authored await boundary. AwaitInteractionRecord is the transport-facing projection. That distinction prevents execution state, dispatch strategy, and step cardinality from collapsing into one ambiguous record.
CSV Payments Applied Model ​
csv-payments applies this model to a Kafka-backed payment-provider boundary:
Process Csv Payments Inputexpands an input file into a stream ofPaymentRecorditems.Await Payment Provideris authored askind: awaitwithcardinality: ONE_TO_ONE.- Because the await step receives a stream, TPF creates one owning await unit with one item interaction per
PaymentRecord. - The Kafka adapter publishes requests to
csv-payments.payment.requests; the mock provider publishes completions tocsv-payments.payment.results. - Completed item outputs are
PaymentStatusrecords. The runtime can continue per-item work throughProcess Payment Status, then release the parent execution at the next aggregate boundary.
The important detail is that CSV does not model the provider as a pipeline step. The provider is an external actor reached through the await transport. The pipeline resumes from admitted PaymentStatus completions.
Cardinality As Unit Shape ​
Cardinality defines the unit TPF must durably replay.
| Authored cardinality | Unit shape | Interactions | Resume input |
|---|---|---|---|
ONE_TO_ONE on one input | one input, one output | one primary interaction | scalar output |
ONE_TO_ONE over a stream | one unit owning ordered item interactions | one interaction per input item | ordered list/stream of completed item outputs |
ONE_TO_MANY | one input, many output items | one primary interaction | materialized output unit replayed as a stream |
MANY_TO_ONE | many input items, one output | one primary interaction after input materialization | scalar output |
MANY_TO_MANY | many input items, many output items | one primary interaction after input materialization | materialized output unit replayed as a stream |
The unit, not an ad hoc dispatch mode, decides what gets snapshotted and replayed. For aggregate cardinalities, v1 materializes the input and/or output unit. If downstream replay fails halfway through a materialized output unit, TPF restarts replay of that whole output unit. It does not claim exactly-once progress inside the unit.