Use these rules when building host apps with Jizoku or changing Jizoku itself.
Core Model
- Jizoku is an embedded durable workflow runtime for Elixir applications.
- Workflow authors define compiled Elixir workflow modules with triggers, payload contracts, steps, transitions, waits, approvals, retries, and recovery routes.
- The Jido-native journal runtime is the source of truth for run, dispatch, attempt, manual-control, and terminal facts.
- Host workers provide execution capacity by calling
Jizoku.execute_next/1. - Runtime command, run, runnable, and attempt trace lineage is durable journal data; public telemetry is a best-effort projection of committed lifecycle facts and execution spans.
- Optional schedulers can deliver cron payloads through
Jizoku.Runtime.Runner.perform/2. - Optional backend adapters, such as the Bedrock example, can own durable delivery and lease mechanics without changing workflow modules.
Rules To Follow
- Prefer
use Jizoku.Stepfor custom workflow steps. - Use raw
Jido.Actionmodules only for explicit interop. - Schedule raw
Jido.Instructionvalues only throughJizoku.schedule_dynamic_work/3, with an explicit applied runnable origin and a host-owned action registry. - Return
{:ok, output}or{:ok, output, []}from rawJido.Actionmodules. Jizoku rejects non-empty or malformed action extras as an explicit action failure; it never silently discards Jido directives. - Pass recognized Jizoku command
Jido.Signalenvelopes directly toJizoku.apply_signal/2. Do not manually call the adapter first. Route arbitrary domain signals only through a host-ownedJizoku.Jido.SignalResolverthat returns closed lifecycle commands. - Resolver start commands must name compiled workflow modules in host code. Never derive modules, runtime options, queues, storage, or dispatch adapters from signal strings.
- Treat the Jido envelope source as durable provenance, not authorization. Authenticate and authorize inbound signals before applying them.
- Keep workflow definitions backend-neutral.
- Keep delivery and job boundaries thin; call host-owned modules that wrap Jizoku public APIs.
- Pass the same trusted
:partitionthrough every start, worker, cron, signal, control, replay, and read-model boundary when a host isolates workflow state by tenant or domain. Omitting it selects the legacy unpartitioned namespace. - Treat partitions as storage routing, not authorization. Authorize the caller before selecting a partition or returning its run data.
- Use
Jizoku.list_runs/2for index views andJizoku.inspect_run/2,Jizoku.inspect_run_graph/2,Jizoku.inspect_run_timeline/2, orJizoku.explain_run/2for details. - Use continue-as-new to bound recurring workflow history. Keep successor input
explicit, choose a stable continuation key, and use
Jizoku.inspect_continuation_chain/2with a bounded:max_hopswhen more than the immediate lineage edge is required. - Use
Jizoku.record_dynamic_work/3when host/runtime code needs to persist bounded, inspection-only dynamic work metadata for a run. - Use
Jizoku.preview_dynamic_work/3when dashboards or visual editors need to validate candidate dynamic work and inspect the graph overlay before appending. - Use
Jizoku.preview_graph_mutation/3before proposing dependency-ordered graph changes. Commit withJizoku.apply_graph_mutation/3, and callJizoku.reconcile_dynamic_graph/2when the report or inspection state says reconciliation is required. - Use
Jizoku.preview_spec/3orJizoku.preview_spec/4when visual editors need execution-style node output for a runtime-authored draft. Pass a host-owned:action_registry; preview calls only registry entries that opt intodry_runbehavior and does not append durable runtime state. - Use
:guardrail_registrywith runtime-authored specs that declare stepopts[:guardrails]; guardrail keys are host-owned validator contracts and decisions are exposed through previews, inspection, and explanations. - Add idempotency keys or domain duplicate detection to side-effecting steps.
- Use
Jizoku.Telemetry.metrics/0for the default bounded-cardinality metric set. Keep reporters, exporters, dashboards, alerts, and logging host-owned. - Treat external exactly-once behavior as out of scope for Jizoku.
Rules To Avoid
- Do not configure
:executorfor step execution. - Do not use or document
:runtime_tables. - Do not deliver step or compensation payloads through
Jizoku.Runtime.Runner.perform/2. - Do not append
:dynamic_work_recordedjournal entries directly from host app code; use the public recording API so validation stays centralized. - Do not make workflow modules depend on Bedrock, Oban, or another backend's APIs.
- Do not use
String.to_atom/1on external input or persisted untrusted data.