Packages

Durable execution for Skuld: SerializableCoroutine and EffectLogger for capturing and replaying effect logs.

Current section

2 Versions

Jump to

Compare versions

6 files changed
+102 additions
-11 deletions
  @@ -1,14 +1,31 @@
1 1 # Changelog
2 2
3 - <!-- last-updated-against: ca199b2 -->
3 + <!-- last-updated-against: 0b88768 -->
4 4
5 5 All notable changes to `skuld_durable` will be documented in this file.
6 6
7 + ## [0.32.1] — 2026-06-10
8 +
9 + ### Added
10 + - `README.md` with package overview, installation, and quick start.
11 +
12 +
13 + - `docs/effects/serializable-coroutine.md` — covers building durable coroutines,
14 + running (fresh, live resume, cold resume), serializing/deserializing logs.
15 + - `durable-computation.md` recipe added to extras (shared from skuld package docs).
16 +
17 + ### Improved
18 +
19 + - `Skuld.SerializableCoroutine` `@moduledoc` now includes a package-level intro
20 + describing what `skuld_durable` provides and linking to the architecture guide.
21 +
7 22 ## [0.32.0] — 2026-06-07
8 23
9 24 Initial release. Extracted from `skuld` v0.32.0.
10 25
11 26 ### Added
27 + - `README.md` with package overview, installation, and quick start.
28 +
12 29
13 30 - **SerializableCoroutine** — wraps a computation with EffectLogger to capture a JSON-serializable effect log. Supports cold resume from serialized state, enabling durable, pausable workflows
14 31 - **EffectLogger** — logs all effect invocations for serialization, replay, and audit. Captures effect state snapshots and full effect entries as JSON-serializable structs
  @@ -0,0 +1,50 @@
1 + # skuld_durable
2 +
3 + <!-- nav:header:start -->
4 + [EffectLogger & SerializableCoroutine >](docs/effects/effectlogger.md) | [Umbrella →](https://hexdocs.pm/skuld/architecture.html)
5 + <!-- nav:header:end -->
6 +
7 + Durable execution for Skuld: pause-serialize-resume workflows and effect logging.
8 +
9 + ## What's included
10 +
11 + - **`Skuld.SerializableCoroutine`** — pause-serialize-resume for durable workflows
12 + - **`Skuld.Effects.EffectLogger`** — execution logging with replay, resume, and rerun
13 +
14 + ## Installation
15 +
16 + ```elixir
17 + def deps do
18 + [
19 + {:skuld_durable, "~> 0.32"}
20 + ]
21 + end
22 + ```
23 +
24 + ## Quick start
25 +
26 + ```elixir
27 + alias Skuld.SerializableCoroutine
28 +
29 + sc = SerializableCoroutine.new(MyWizard.run(), fn comp ->
30 + comp |> State.with_handler(%{}) |> Yield.with_handler() |> Throw.with_handler()
31 + end)
32 +
33 + # Fresh start — suspends at first yield
34 + suspended = SerializableCoroutine.run(sc)
35 +
36 + # Serialize and persist
37 + json = SerializableCoroutine.serialize(SerializableCoroutine.get_log(suspended))
38 +
39 + # Later: cold resume from serialised state
40 + SerializableCoroutine.run(json, sc, resume_value)
41 + ```
42 +
43 + See the [architecture guide](https://hexdocs.pm/skuld/architecture.html) for how this fits into the Skuld ecosystem.
44 +
45 + <!-- nav:footer:start -->
46 +
47 + ---
48 +
49 + [EffectLogger & SerializableCoroutine >](docs/effects/effectlogger.md) | [Umbrella →](https://hexdocs.pm/skuld/architecture.html)
50 + <!-- nav:footer:end -->
  @@ -1 +1 @@
1 - 0.32.0
1 + 0.32.1
  @@ -1,6 +1,6 @@
1 1 {<<"links">>,[{<<"GitHub">>,<<"https://github.com/mccraigmccraig/skuld">>}]}.
2 2 {<<"name">>,<<"skuld_durable">>}.
3 - {<<"version">>,<<"0.32.0">>}.
3 + {<<"version">>,<<"0.32.1">>}.
4 4 {<<"description">>,
5 5 <<"Durable execution for Skuld: SerializableCoroutine and EffectLogger for capturing and replaying effect logs.">>}.
6 6 {<<"elixir">>,<<"~> 1.19">>}.
  @@ -12,18 +12,18 @@
12 12 <<"lib/skuld/effects/effect_logger/log.ex">>,
13 13 <<"lib/skuld/effects/effect_logger/effect_log_entry.ex">>,
14 14 <<"lib/skuld/effects/effect_logger.ex">>,<<".formatter.exs">>,<<"mix.exs">>,
15 - <<"VERSION">>,<<"CHANGELOG.md">>]}.
15 + <<"README.md">>,<<"VERSION">>,<<"CHANGELOG.md">>]}.
16 16 {<<"licenses">>,[<<"MIT">>]}.
17 17 {<<"requirements">>,
18 18 [[{<<"name">>,<<"skuld">>},
19 19 {<<"app">>,<<"skuld">>},
20 20 {<<"optional">>,false},
21 - {<<"requirement">>,<<"~> 0.32.0">>},
21 + {<<"requirement">>,<<"~> 0.32.1">>},
22 22 {<<"repository">>,<<"hexpm">>}],
23 23 [{<<"name">>,<<"skuld_concurrency">>},
24 24 {<<"app">>,<<"skuld_concurrency">>},
25 25 {<<"optional">>,false},
26 - {<<"requirement">>,<<"~> 0.32.0">>},
26 + {<<"requirement">>,<<"~> 0.32.1">>},
27 27 {<<"repository">>,<<"hexpm">>}],
28 28 [{<<"name">>,<<"jason">>},
29 29 {<<"app">>,<<"jason">>},
  @@ -2,6 +2,12 @@ defmodule Skuld.SerializableCoroutine do
2 2 @moduledoc """
3 3 Helpers for building coroutines with serializable effect logs.
4 4
5 + Part of the `skuld_durable` package, which provides durable execution
6 + through SerializableCoroutine (pause-serialize-resume workflows) and
7 + EffectLogger (execution logging and replay). See the
8 + [architecture guide](https://hexdocs.pm/skuld/architecture.html)
9 + for how these fit into the Skuld ecosystem.
10 +
5 11 `new/2` constructs a struct with `EffectLogger` installed innermost,
6 12 so every effect invocation across all handlers is captured in a
7 13 JSON-serializable log.
Loading more files…