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.