Amends 0102: the engine sits behind a port, and
Temporal is a supported driver.
Context
0102 chose an in-process engine with a Postgres journal. The owner’s workflow answer FW9 (mem L544, 2026-10-20, with a correction at L542) requires the engine to be driver-agnostic: the same workflow runs on a native driver or on Temporal. Temporal’s checkpointed steps are activities, so a workflow body must be deterministic. This conflicts with the declarative graph of 0094. Contradiction C-09 is resolved as follows: the graph is the deterministic body, and the lint checks that itswhen and input expressions are pure.
Decision
- Workflows are written once, with
@Workflowand@Step. Checkpointed steps map to Temporal activities. - The engine sits behind a
WorkflowEngineport. - The native driver is the default and costs nothing. It uses the Postgres outbox, queue and scheduler. It runs on Encore in SaaS, and needs no extra infrastructure on-prem.
- The Temporal driver is part of Pro. It runs on Temporal Cloud or self-hosted, and is chosen per environment.
- The workflow body is the declarative graph. A lint checks that each
whenandinputexpression is pure and deterministic. - A conformance suite runs on both drivers.
Consequences
- A workflow author writes a graph, not imperative code, so the same workflow runs on either driver.
- Temporal is a supported driver. The 0011 table needs a Temporal row; that change belongs to the final pass (ADR 0227).
Enforcement
planned — the purity lint onwhen and input, and the conformance suite on both drivers. The lint and suite are not built yet.
Alternatives
- Imperative workflow bodies: rejected by 0094, and they would not be portable to Temporal’s model.
- Native only: rejected, Temporal is a supported driver where a customer needs it.
Supersedes and sources
Supersedes: none. Amends: 0102. Sources: owner workflow answer FW9 with its correction (stackra-decisions-2026-10-19.md
L542, L544, 2026-10-20); the resolution of C-09 (stackra-notes/decision-register.md, contradictions table).