<?xml version="1.0" encoding="utf-8" standalone="yes"?><rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom"><channel><title>Release Notes on Dwarf</title><link>https://docs.dwarf.run/about/release-notes/</link><description>Recent content in Release Notes on Dwarf</description><generator>Hugo</generator><language>en-US</language><atom:link href="https://docs.dwarf.run/about/release-notes/index.xml" rel="self" type="application/rss+xml"/><item><title>v0.14.0</title><link>https://docs.dwarf.run/about/release-notes/v0.14.0/</link><pubDate>Mon, 01 Jan 0001 00:00:00 +0000</pubDate><guid>https://docs.dwarf.run/about/release-notes/v0.14.0/</guid><description>&lt;h1 id="v0140--a-daily-archive-for-closed-flows-lists-by-state-continue-by-key"&gt;v0.14.0 — A Daily Archive for Closed Flows, Lists by State, Continue by Key&lt;a class="anchor" href="#v0140--a-daily-archive-for-closed-flows-lists-by-state-continue-by-key" aria-label="Anchor" aria-hidden="true"&gt;&lt;/a&gt;&lt;/h1&gt;
&lt;p&gt;&lt;em&gt;Upcoming release: these notes may change before it is published on &lt;a href="https://github.com/microbus-io/dwarf/releases" target="_blank" rel="noopener"&gt;GitHub Releases&lt;/a&gt;.&lt;/em&gt;&lt;/p&gt;
&lt;p&gt;Closed flows now move to an archive about a minute after they close, kept by the day for a retention you set and
dropped a day at a time, so the live tables that every step reads hold the open flows and little else. An archived
flow reads by its key as before. The lists are named by a flow&amp;rsquo;s state - &lt;code&gt;ListOpen&lt;/code&gt; and &lt;code&gt;ListClosed&lt;/code&gt; - and
&lt;code&gt;SetFlowExpiration&lt;/code&gt; can end flows that would otherwise never close. &lt;strong&gt;This release edits migrations that earlier
releases shipped, so existing databases cannot be upgraded in place&lt;/strong&gt;: start v0.14.0 on fresh databases (see
&lt;a href="https://docs.dwarf.run/operating/upgrading/" target="_blank" rel="noopener"&gt;Upgrading&lt;/a&gt;). Nothing detects an old database: &lt;code&gt;Startup&lt;/code&gt; succeeds on one, and &lt;code&gt;ListOpen&lt;/code&gt; then fails
on every call.&lt;/p&gt;</description></item><item><title>v0.13.0</title><link>https://docs.dwarf.run/about/release-notes/v0.13.0/</link><pubDate>Mon, 01 Jan 0001 00:00:00 +0000</pubDate><guid>https://docs.dwarf.run/about/release-notes/v0.13.0/</guid><description>&lt;h1 id="v0130--the-creation-hour-in-every-flow-and-step-key"&gt;v0.13.0 — The Creation Hour in Every Flow and Step Key&lt;a class="anchor" href="#v0130--the-creation-hour-in-every-flow-and-step-key" aria-label="Anchor" aria-hidden="true"&gt;&lt;/a&gt;&lt;/h1&gt;
&lt;p&gt;&lt;em&gt;Released 2026-10-31. &lt;a href="https://github.com/microbus-io/dwarf/releases/tag/v0.13.0" target="_blank" rel="noopener"&gt;GitHub release&lt;/a&gt;.&lt;/em&gt;&lt;/p&gt;
&lt;p&gt;Flow and step keys carry the flow&amp;rsquo;s creation hour, and a step key names its flow. This is groundwork for retaining
ended flows cheaply. &lt;strong&gt;This release edits migrations that earlier releases shipped, so existing databases cannot be
upgraded in place&lt;/strong&gt;: start v0.13.0 on fresh databases (see &lt;a href="https://github.com/microbus-io/dwarf/blob/v0.13.0/docs/upgrading.md" target="_blank" rel="noopener"&gt;Upgrading&lt;/a&gt;).&lt;/p&gt;
&lt;h2 id="breaking-changes"&gt;Breaking Changes&lt;a class="anchor" href="#breaking-changes" aria-label="Anchor" aria-hidden="true"&gt;&lt;/a&gt;&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;Flow keys are &lt;code&gt;{shard}-{hour}-{flowID}-{token}&lt;/code&gt;.&lt;/strong&gt; &lt;code&gt;{hour}&lt;/code&gt; is the flow&amp;rsquo;s creation hour, in whole hours since
2000-01-01 00:00 UTC, taken from the database clock. This applies everywhere a flow key appears:&lt;/p&gt;</description></item><item><title>v0.12.0</title><link>https://docs.dwarf.run/about/release-notes/v0.12.0/</link><pubDate>Mon, 01 Jan 0001 00:00:00 +0000</pubDate><guid>https://docs.dwarf.run/about/release-notes/v0.12.0/</guid><description>&lt;h1 id="v0120--reducers-that-fold-everywhere-history-stored-once-priority-bands-that-spill"&gt;v0.12.0 — Reducers That Fold Everywhere, History Stored Once, Priority Bands That Spill&lt;a class="anchor" href="#v0120--reducers-that-fold-everywhere-history-stored-once-priority-bands-that-spill" aria-label="Anchor" aria-hidden="true"&gt;&lt;/a&gt;&lt;/h1&gt;
&lt;p&gt;&lt;em&gt;Released 2026-10-23. &lt;a href="https://github.com/microbus-io/dwarf/releases/tag/v0.12.0" target="_blank" rel="noopener"&gt;GitHub release&lt;/a&gt;.&lt;/em&gt;&lt;/p&gt;
&lt;p&gt;v0.12.0 makes a reduced field mean the same thing wherever a task writes it. Every write to a field with a
reducer is a &lt;strong&gt;contribution&lt;/strong&gt;, folded through the reducer at every hand-off: the next step, the fan-in, the final
state and &lt;code&gt;Continue&lt;/code&gt;. A task writes only what it adds, and the outcome no longer depends on the graph&amp;rsquo;s shape. An
agent loop&amp;rsquo;s history is stored &lt;strong&gt;once&lt;/strong&gt;: a field under &lt;code&gt;append&lt;/code&gt;, or a list a task keeps rewriting but only extends,
is kept as references to the rows that hold its elements rather than as the whole history at every step.
Priorities are now five &lt;strong&gt;bands&lt;/strong&gt; that spill, so a better band no longer starves a worse one while workers sit
idle. Beneath that, the engine does fewer round trips per step, a shard is dispatched by two replicas at a
budgeted pool, and a step whose transition was lost to a crash is replayed rather than stranded.&lt;/p&gt;</description></item><item><title>v0.11.0</title><link>https://docs.dwarf.run/about/release-notes/v0.11.0/</link><pubDate>Mon, 01 Jan 0001 00:00:00 +0000</pubDate><guid>https://docs.dwarf.run/about/release-notes/v0.11.0/</guid><description>&lt;h1 id="v0110--graceful-cancel-budget-bound-shard-connections-measured-pool-sizing"&gt;v0.11.0 — Graceful Cancel, Budget-Bound Shard Connections, Measured Pool Sizing&lt;a class="anchor" href="#v0110--graceful-cancel-budget-bound-shard-connections-measured-pool-sizing" aria-label="Anchor" aria-hidden="true"&gt;&lt;/a&gt;&lt;/h1&gt;
&lt;p&gt;&lt;em&gt;Released 2026-09-28. &lt;a href="https://github.com/microbus-io/dwarf/releases/tag/v0.11.0" target="_blank" rel="noopener"&gt;GitHub release&lt;/a&gt;.&lt;/em&gt;&lt;/p&gt;
&lt;p&gt;v0.11.0 gives a flow a way to stop &lt;strong&gt;gracefully&lt;/strong&gt;. The immediate, unconditional stop is renamed &lt;strong&gt;&lt;code&gt;Terminate&lt;/code&gt;&lt;/strong&gt;,
and &lt;strong&gt;&lt;code&gt;Cancel&lt;/code&gt;&lt;/strong&gt; now delivers the cancellation to every step in progress as an error on its node&amp;rsquo;s &lt;code&gt;onError&lt;/code&gt;
transition, so a workflow can compensate, clean up, or carry on. The flow ends &lt;code&gt;cancelled&lt;/code&gt;, &lt;code&gt;failed&lt;/code&gt;, or
&lt;code&gt;completed&lt;/code&gt;, depending on what its handlers do. Beneath that, a shard&amp;rsquo;s connection budget no longer grows with the
fleet. A few replicas per shard &lt;strong&gt;dispatch&lt;/strong&gt; it and split its budget, and every other replica holds a
two-connection reader pool there, so a host scaled wide for its own traffic can no longer over-connect the
database. Pool sizes come from &lt;strong&gt;measured&lt;/strong&gt; sweeps on six database sizes instead of a model, sleeping steps get an
index of their own so they stop slowing every scheduling pass, and graph validation rejects field names that a
&lt;code&gt;when&lt;/code&gt; expression could never reference.&lt;/p&gt;</description></item><item><title>v0.10.5</title><link>https://docs.dwarf.run/about/release-notes/v0.10.5/</link><pubDate>Mon, 01 Jan 0001 00:00:00 +0000</pubDate><guid>https://docs.dwarf.run/about/release-notes/v0.10.5/</guid><description>&lt;h1 id="v0105--update-dependencies"&gt;v0.10.5 — Update Dependencies&lt;a class="anchor" href="#v0105--update-dependencies" aria-label="Anchor" aria-hidden="true"&gt;&lt;/a&gt;&lt;/h1&gt;
&lt;p&gt;&lt;em&gt;Released 2026-08-03. &lt;a href="https://github.com/microbus-io/dwarf/releases/tag/v0.10.5" target="_blank" rel="noopener"&gt;GitHub release&lt;/a&gt;.&lt;/em&gt;&lt;/p&gt;
&lt;p&gt;Update dependencies to latest, including Sequel v1.11.1 which changes the &lt;code&gt;sequel_pool_wait_count&lt;/code&gt; and &lt;code&gt;sequel_pool_wait_duration_seconds&lt;/code&gt; gauges to counters and renames them appropriately.&lt;/p&gt;</description></item><item><title>v0.10.3</title><link>https://docs.dwarf.run/about/release-notes/v0.10.3/</link><pubDate>Mon, 01 Jan 0001 00:00:00 +0000</pubDate><guid>https://docs.dwarf.run/about/release-notes/v0.10.3/</guid><description>&lt;h1 id="v0103--a-fan-out-node-can-route-to-end-instead-of-fanning-out"&gt;v0.10.3 — A Fan-Out Node Can Route to END Instead of Fanning Out&lt;a class="anchor" href="#v0103--a-fan-out-node-can-route-to-end-instead-of-fanning-out" aria-label="Anchor" aria-hidden="true"&gt;&lt;/a&gt;&lt;/h1&gt;
&lt;p&gt;&lt;em&gt;Released 2026-08-03. &lt;a href="https://github.com/microbus-io/dwarf/releases/tag/v0.10.3" target="_blank" rel="noopener"&gt;GitHub release&lt;/a&gt;.&lt;/em&gt;&lt;/p&gt;
&lt;p&gt;Fixes a non-terminating loop. A node that both fans out over an array and carries a
&lt;code&gt;withGoto&lt;/code&gt;/&lt;code&gt;onError&lt;/code&gt; edge to &lt;code&gt;END&lt;/code&gt; — the shape a task-driven loop takes, &amp;ldquo;fan out over
what is pending, or end the flow when there is nothing left to do&amp;rdquo; — now ends the flow
when the task steers to &lt;code&gt;END&lt;/code&gt;.&lt;/p&gt;</description></item><item><title>v0.10.2</title><link>https://docs.dwarf.run/about/release-notes/v0.10.2/</link><pubDate>Mon, 01 Jan 0001 00:00:00 +0000</pubDate><guid>https://docs.dwarf.run/about/release-notes/v0.10.2/</guid><description>&lt;h1 id="v0102--newengineundertest-takes-a-test-name-not-a-testingtb"&gt;v0.10.2 — NewEngineUnderTest Takes a Test Name, Not a testing.TB&lt;a class="anchor" href="#v0102--newengineundertest-takes-a-test-name-not-a-testingtb" aria-label="Anchor" aria-hidden="true"&gt;&lt;/a&gt;&lt;/h1&gt;
&lt;p&gt;&lt;em&gt;Released 2026-08-03. &lt;a href="https://github.com/microbus-io/dwarf/releases/tag/v0.10.2" target="_blank" rel="noopener"&gt;GitHub release&lt;/a&gt;.&lt;/em&gt;&lt;/p&gt;
&lt;p&gt;Test-support change only. &lt;code&gt;engine.NewEngineUnderTest&lt;/code&gt; is now keyed by a plain test
name instead of a &lt;code&gt;testing.TB&lt;/code&gt;, so a host can stand up an isolated engine under its
own harness — one that has no &lt;code&gt;*testing.T&lt;/code&gt; to hand over. A name was all the
constructor ever needed from one.&lt;/p&gt;
&lt;p&gt;No schema migrations. No change to dispatch, scheduling, recovery, pool sizing, or
anything else on the production path.&lt;/p&gt;</description></item><item><title>v0.10.0</title><link>https://docs.dwarf.run/about/release-notes/v0.10.0/</link><pubDate>Mon, 01 Jan 0001 00:00:00 +0000</pubDate><guid>https://docs.dwarf.run/about/release-notes/v0.10.0/</guid><description>&lt;h1 id="v0100--replicas-coordinate-through-the-database-and-size-themselves"&gt;v0.10.0 — Replicas Coordinate Through the Database, and Size Themselves&lt;a class="anchor" href="#v0100--replicas-coordinate-through-the-database-and-size-themselves" aria-label="Anchor" aria-hidden="true"&gt;&lt;/a&gt;&lt;/h1&gt;
&lt;p&gt;&lt;em&gt;Released 2026-08-02. &lt;a href="https://github.com/microbus-io/dwarf/releases/tag/v0.10.0" target="_blank" rel="noopener"&gt;GitHub release&lt;/a&gt;.&lt;/em&gt;&lt;/p&gt;
&lt;p&gt;This release rebuilds how a Dwarf fleet finds work, divides resources, and carries state. &lt;strong&gt;Both the API and the database schema change.&lt;/strong&gt; Dwarf is v0.x, so upgrading is a maintenance window, not a rolling deploy — see &lt;a href="https://github.com/microbus-io/dwarf/blob/v0.10.0/docs/upgrading.md" target="_blank" rel="noopener"&gt;docs/upgrading.md&lt;/a&gt;.&lt;/p&gt;
&lt;h2 id="breaking-changes"&gt;Breaking Changes&lt;a class="anchor" href="#breaking-changes" aria-label="Anchor" aria-hidden="true"&gt;&lt;/a&gt;&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;&lt;code&gt;Host&lt;/code&gt; loses &lt;code&gt;SignalPeers&lt;/code&gt;.&lt;/strong&gt; The engine now sends nothing to its peers at all; hosts implement two methods, &lt;code&gt;LoadGraph&lt;/code&gt; and &lt;code&gt;ExecuteTask&lt;/code&gt;. Three signal kinds existed here and all three were deleted after measurement — a per-step work doorbell, a per-flow stop broadcast, and a fleet-membership nudge — because in each case the poll the engine already runs converges faster than the message.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;&lt;code&gt;SetShard(ShardSpec{Index, DSN, VirtualCPUs})&lt;/code&gt; replaces &lt;code&gt;SetDSN&lt;/code&gt; / &lt;code&gt;SetNumShards&lt;/code&gt; / &lt;code&gt;SetWorkersPerConn&lt;/code&gt;.&lt;/strong&gt; You declare facts about each shard&amp;rsquo;s server; the engine derives the tuning. New &lt;code&gt;SetEngineID&lt;/code&gt; pins a replica identity so restarts don&amp;rsquo;t inflate the observed fleet count.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;&lt;code&gt;workflow.State&lt;/code&gt; is a type, not a &lt;code&gt;map[string]any&lt;/code&gt;&lt;/strong&gt; — on &lt;code&gt;FlowOutcome.State&lt;/code&gt;, &lt;code&gt;Flow.Snapshot()&lt;/code&gt;, baggage, and interrupt/subgraph payloads. It holds each field as raw JSON and decodes on read. &lt;code&gt;Flow.Delete&lt;/code&gt; → &lt;code&gt;Flow.Del&lt;/code&gt;; &lt;code&gt;Flow.SetState&lt;/code&gt;, &lt;code&gt;Flow.Transform&lt;/code&gt;, &lt;code&gt;MergeState&lt;/code&gt;, &lt;code&gt;Graph.HasFanIn&lt;/code&gt; and the &lt;code&gt;Duration()&lt;/code&gt; helpers are gone; &lt;code&gt;Render()&lt;/code&gt; no longer returns an error; typed getters panic on a mistyped read instead of quietly returning a zero value.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;&lt;code&gt;NewEngineUnderTest(t)&lt;/code&gt; / &lt;code&gt;SetTestName&lt;/code&gt; replace &lt;code&gt;RunInTest&lt;/code&gt; / &lt;code&gt;SetInTest&lt;/code&gt;.&lt;/strong&gt;&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Schema:&lt;/strong&gt; a new &lt;code&gt;dwarf_peers&lt;/code&gt; registry, new step columns (&lt;code&gt;state_refs&lt;/code&gt;, &lt;code&gt;engine_id&lt;/code&gt;), fixed-width &lt;code&gt;CHAR&lt;/code&gt; tokens and statuses widened to &lt;code&gt;VARCHAR&lt;/code&gt;, and SQL Server JSON payloads stored as &lt;code&gt;VARBINARY&lt;/code&gt; — which ends a silent corruption of non-ASCII payloads on that dialect. The baseline migrations are edited in place, so &lt;strong&gt;a database created by v0.9.x cannot be migrated forward — recreate it.&lt;/strong&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id="coordination-is-the-database-and-nothing-else"&gt;Coordination Is the Database, and Nothing Else&lt;a class="anchor" href="#coordination-is-the-database-and-nothing-else" aria-label="Anchor" aria-hidden="true"&gt;&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;Replicas discover each other through a &lt;code&gt;dwarf_peers&lt;/code&gt; registry read per shard, not through the host&amp;rsquo;s transport. From one reading a replica derives two different numbers with deliberately opposite risk postures: how many ways to divide a shard&amp;rsquo;s connection budget (over-count and you collapse a database) and which replicas demonstrably dispatch work (over-count and you strand it). A replica that goes blind holds its last good reading rather than acting on silence.&lt;/p&gt;</description></item><item><title>v0.9.5</title><link>https://docs.dwarf.run/about/release-notes/v0.9.5/</link><pubDate>Mon, 01 Jan 0001 00:00:00 +0000</pubDate><guid>https://docs.dwarf.run/about/release-notes/v0.9.5/</guid><description>&lt;h1 id="v095--seamster-extraction-and-graphvalidate-race-fix"&gt;v0.9.5 — Seamster Extraction and Graph.Validate Race Fix&lt;a class="anchor" href="#v095--seamster-extraction-and-graphvalidate-race-fix" aria-label="Anchor" aria-hidden="true"&gt;&lt;/a&gt;&lt;/h1&gt;
&lt;p&gt;&lt;em&gt;Released 2026-07-07. &lt;a href="https://github.com/microbus-io/dwarf/releases/tag/v0.9.5" target="_blank" rel="noopener"&gt;GitHub release&lt;/a&gt;.&lt;/em&gt;&lt;/p&gt;
&lt;p&gt;This release fixes a concurrency bug in graph validation and moves the engine&amp;rsquo;s test-only instrumentation into a
standalone module. Both live in one commit (&lt;code&gt;0c113c3&lt;/code&gt;).&lt;/p&gt;
&lt;h2 id="fixed"&gt;Fixed&lt;a class="anchor" href="#fixed" aria-label="Anchor" aria-hidden="true"&gt;&lt;/a&gt;&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;Data race in &lt;code&gt;workflow.Graph.Validate&lt;/code&gt;.&lt;/strong&gt; &lt;code&gt;Validate()&lt;/code&gt; built the fan-out to fan-in convergence map as a side
effect stored on the graph. Because a graph is loaded once and shared across concurrent &lt;code&gt;Create&lt;/code&gt; calls, two
validations (or a validation racing a &lt;code&gt;MarshalJSON&lt;/code&gt;) wrote and read that field at the same time, which the race
detector flagged and which could corrupt the map. &lt;code&gt;Validate()&lt;/code&gt; is now pure over the graph&amp;rsquo;s immutable definition
and stores nothing on the graph.&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id="changed"&gt;Changed&lt;a class="anchor" href="#changed" aria-label="Anchor" aria-hidden="true"&gt;&lt;/a&gt;&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;Fan-in routing is now derived at dispatch, not persisted.&lt;/strong&gt; The fan-out to fan-in map is a pure function of the
graph structure, so the engine computes it per flow from the frozen graph definition (new internal package
&lt;code&gt;internal/faninmap&lt;/code&gt;) and caches it beside the parsed graph. It is no longer written into the stored graph JSON, so
a workflow graph carries only its author-defined shape over the wire.&lt;/p&gt;</description></item><item><title>v0.9.4</title><link>https://docs.dwarf.run/about/release-notes/v0.9.4/</link><pubDate>Mon, 01 Jan 0001 00:00:00 +0000</pubDate><guid>https://docs.dwarf.run/about/release-notes/v0.9.4/</guid><description>&lt;h1 id="v094--maintenance-release-no-api-or-behavior-changes-to-the-engine"&gt;v0.9.4 — Maintenance Release. No API or Behavior Changes to the Engine&lt;a class="anchor" href="#v094--maintenance-release-no-api-or-behavior-changes-to-the-engine" aria-label="Anchor" aria-hidden="true"&gt;&lt;/a&gt;&lt;/h1&gt;
&lt;p&gt;&lt;em&gt;Released 2026-07-06. &lt;a href="https://github.com/microbus-io/dwarf/releases/tag/v0.9.4" target="_blank" rel="noopener"&gt;GitHub release&lt;/a&gt;.&lt;/em&gt;&lt;/p&gt;
&lt;h2 id="fixes"&gt;Fixes&lt;a class="anchor" href="#fixes" aria-label="Anchor" aria-hidden="true"&gt;&lt;/a&gt;&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;Test stability:&lt;/strong&gt; Fixed a MySQL-timing flake in &lt;code&gt;TestFault_PollSizingErr&lt;/code&gt;. The &lt;code&gt;faultPollSizingErr&lt;/code&gt;
fault is now armed sticky rather than one-shot, so the background &lt;code&gt;timerLoop&lt;/code&gt;&amp;rsquo;s own poll can no longer
consume the fault before the test&amp;rsquo;s explicit poll — the poll reliably clamps to the near-term
error-retry interval instead of occasionally sleeping the full &lt;code&gt;maxPollInterval&lt;/code&gt;.&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id="dependencies"&gt;Dependencies&lt;a class="anchor" href="#dependencies" aria-label="Anchor" aria-hidden="true"&gt;&lt;/a&gt;&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;Bumped &lt;code&gt;github.com/microbus-io/sequel&lt;/code&gt; &lt;code&gt;v1.10.6&lt;/code&gt; → &lt;code&gt;v1.10.7&lt;/code&gt;.&lt;/li&gt;
&lt;li&gt;Bumped &lt;code&gt;golang.org/x/text&lt;/code&gt; &lt;code&gt;v0.38.0&lt;/code&gt; → &lt;code&gt;v0.39.0&lt;/code&gt; (indirect).&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id="docs"&gt;Docs&lt;a class="anchor" href="#docs" aria-label="Anchor" aria-hidden="true"&gt;&lt;/a&gt;&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;Removed the stale Go Report Card badge from &lt;code&gt;README.md&lt;/code&gt;.&lt;/li&gt;
&lt;/ul&gt;</description></item><item><title>v0.9.3</title><link>https://docs.dwarf.run/about/release-notes/v0.9.3/</link><pubDate>Mon, 01 Jan 0001 00:00:00 +0000</pubDate><guid>https://docs.dwarf.run/about/release-notes/v0.9.3/</guid><description>&lt;h1 id="v093--poll-operation"&gt;v0.9.3 — Poll Operation&lt;a class="anchor" href="#v093--poll-operation" aria-label="Anchor" aria-hidden="true"&gt;&lt;/a&gt;&lt;/h1&gt;
&lt;p&gt;&lt;em&gt;Released 2026-07-05. &lt;a href="https://github.com/microbus-io/dwarf/releases/tag/v0.9.3" target="_blank" rel="noopener"&gt;GitHub release&lt;/a&gt;.&lt;/em&gt;&lt;/p&gt;
&lt;p&gt;The engine now exposes Poll(ctx, flowKey) alongside Await. Like Await, it blocks up to the context deadline for a flow to stop, but where Await treats a deadline expiring before the flow stops as a timeout error, Poll instead returns the flow&amp;rsquo;s current outcome — non-terminal, with Stopped() reporting false — and no error. This makes it the natural fit for bridging an open-ended durable flow to a bounded request (for example, answering an HTTP long-poll within its time budget and re-polling on the next request) without conflating &amp;ldquo;not done yet&amp;rdquo; with a real failure. The returned FlowOutcome gains a Stopped() helper to distinguish a terminal/interrupted outcome from one still running. As always, the underlying flow keeps running on the engine independent of the caller; a ctx timeout never tears it down.&lt;/p&gt;</description></item></channel></rss>