Release Notes
Every BackWave library shares a single version, so each release below covers every package.
v1.4.0
Latest- AddedA reflection-free, Native AOT-compatible core. BackWave, BackWave.Hosting, BackWave.Postgres, BackWave.OpenTelemetry, and BackWave.Pro.Mcp are certified trim- and AOT-safe, so they build warning-free and run under a published Native AOT host with no dynamic-code fallback. The dashboard also renders correctly under a consumer’s Native AOT publish.
- AddedBackWave.OpenTelemetry, a new registration package. A single AddBackWaveInstrumentation() call, defined on both the tracer- and meter-provider builders, subscribes BackWave’s job-lifecycle traces and metrics to your existing OpenTelemetry pipeline. It references only the OpenTelemetry API and subscribes by source name, so it pulls no BackWave assembly into your build.
- AddedA structured-logs pillar, the third alongside traces and metrics. A source-generated log catalog with stable event ids across Core, Hosting, and Pro emits through ILogger and auto-bridges into OpenTelemetry Logs. It is off by default and allocates nothing until a listener attaches.
- AddedPer-adapter database store spans (db.* attributes) and a backwave.store.faults meter for PostgreSQL, SQL Server, and SQLite, opt-in per adapter so the chattier store signals never crowd the job-lifecycle view unless you ask for them.
- AddedNew lifecycle metrics: schedule-delay, queue-wait, and observer-dispatch duration histograms, a dead-letter counter, worker-slot active and capacity instruments that join by consumer group, and an error.type dimension on the failure counter.
- ChangedBackWave’s job-lifecycle telemetry now follows the OpenTelemetry messaging semantic conventions, so it lines up with the rest of your OTel data out of the box. Enqueue emits a send span, claim a receive span, and execute a process span, all carrying standard messaging.* attributes; throughput reports on messaging.client.sent.messages and messaging.client.consumed.messages, and execution latency on the messaging.process.duration histogram in seconds.
- ChangedEnqueue-to-execute correlation is now carried as a span link, so a process span links back to its originating enqueue and a workflow fan-in step links to every upstream step it joined, correlation a single parent edge cannot express. It degrades safely: a Job enqueued with no ambient trace still starts a clean root span.
v1.3.0
- AddedWorkflows v2: a strongly-typed workflow builder that references each step by its .NET type instead of a string name, so a renamed or moved step becomes a compile error rather than a runtime surprise. It lowers to the same underlying graph the previous builder produced, so storage, adapters, and the determinism boundary are unchanged.
- AddedTyped Job Output. A step reads a parent’s result with ctx.Output<TStep, TOut>() and publishes its own with SetOutput, both checked at compile time.
- AddedAn immutable Workflow Input seed, passed once when the workflow is enqueued and readable from any step, so a graph no longer needs a first step whose only purpose is to carry parameters.
- AddedTyped parallel fan-out and fan-in for running independent steps at once and joining their results.
- AddedSaga compensation with .WithCompensation, so a step can register the undo that runs if a later step fails.
- AddedChild workflows with .ThenWorkflow, spliced inline into one flat graph.
- AddedConditional branching with .If, wired as a gate step whose predicate can read the input seed; the arm that is not taken is cancelled rather than left pending.
- AddedA span per workflow step on the existing OpenTelemetry trace, tagged with the workflow name, member count, and dependencies.
- AddedA BW0007 analyzer with a one-click fix that flags a workflow or output type missing from your JsonSerializerContext and adds it for you.
v1.2.0
- AddedA distributed lock that coordinates cold-boot migration. When a whole fleet starts at once, one node acquires the lock and migrates while the rest wait, so concurrent startup can no longer race the schema. Postgres uses a transaction-scoped advisory lock, SQL Server sp_getapplock, and SQLite a single-writer transaction. SQL Server also retries transient cold-boot faults.
- AddedBackWave.Pro.Mcp, a bundled Model Context Protocol server that exposes BackWave to AI agents. Its 23 tools sit behind a per-tool gate: writes and sensitive tools stay hidden and fail closed unless you enable them.
- AddedA live metrics panel on the dashboard for in-process throughput, top and faulting endpoints, and approximate p95/p99 latency, wired up through the AddBackWave block.
- AddedA backwave.job.duration OpenTelemetry histogram emitted at the execute edge.
- AddedAn injectable TimeProvider threaded through the worker and observer pumps, so you can drive time from your host and in tests.
- AddedTag Suggest on the dashboard: case-insensitive prefix completion for job tags, with full keyboard navigation.
- AddedThe Observers page now surfaces delivery lag, and cron schedules render as friendly labels.
- ChangedThe dashboard now follows the host page’s light and dark theme and honors reduced-motion preferences.
- ChangedThe dashboard layout is now responsive down to narrow widths: tables reflow, filter rows stack, and card headers stack.
- ChangedThe Failures page splits into Dead-Lettered and Quarantine tabs, shows job tags, and adds a copy button on the Failure Detail.
- ChangedConsolidated each adapter’s migrations into a single v1 schema baseline. Existing databases continue to upgrade in place.
- ChangedAligned the free-use and Pro license text with the terms published on the site.
- FixedGenerate a valid deserializer for a job that has no payload members.
- FixedThe live dashboard stream now closes on navigation and preserves scroll position across live updates.
- FixedReport an unknown observer outside the reader scope, correcting a reader-scope error on the PostgreSQL and SQL Server adapters.
v1.1.1
- FixedCorrected package version pins.
v1.1.0
- AddedSupport for .NET 8 and .NET 9 (previously .NET 10 only).
v1.0.0
- AddedTyped jobs and handlers. Attribute a method with [Job] and the source generator emits its payload, handler, and a wire name that survives refactors.
- AddedScheduling. Run a job now, hold it for later, or put it on a recurring cron schedule.
- AddedWorkflows. Compose jobs into a cancellable, restartable DAG where a step can read its parents’ output.
- AddedTransactional enqueue. Jobs enlist in your own database transaction, so they commit or roll back with your business write, with no outbox to maintain.
- AddedStorage on the database you already run, with adapters for PostgreSQL, SQL Server, and SQLite.
- AddedA write-capable dashboard. Inspect queues and job timelines, then requeue, cancel, or pause a queue, with every action authorized by your own app.
- AddedDeterministic testing. Exercise scheduling, retries, and workflows under a virtual clock and assert the outcomes like ordinary code.