Repository navigation
NimBus v4.9.0
NimBus 4.9.0 fixes session ordering and redelivery bugs in Core, the stores and the Functions worker, adds server instructions to the operator MCP server, and annotates the whole public API for nullability.
Highlights
- Fixed a new event overtaking the parked messages of a session that had just been unblocked by a resubmit, skip, retry or hand-off completion. It now parks behind them until their replays arrive.
- Fixed a skip that was redelivered after it had already unblocked its session leaving the session's parked messages stranded. The redelivery now requests the deferred drain.
- Fixed a redelivery of already-processed work rewriting the event's
Completedrow toSkipped. The inbox's duplicate skip no longer replaces a settled row in any store. - Fixed the Functions isolated worker dead-lettering a message when the host lost its session lock. A lost lock or transient Service Bus failure relayed by the host now leaves the message for redelivery.
- Added server instructions to the operator MCP server (
/mcp). They give a connecting agent the safety rules, NimBus's session model, the error codes and the four workflow prompts. - Improved the public API's nullability annotations. Every project is annotated, and a nullable warning now fails the Release build.
- Fixed Settings rows showing a link and a button that opened the same panel. Each row now has one link, named for the next step when there is one.
- Fixed the WebApp logging a caller's event type id with line breaks when composing an event.
- Fixed the vulnerable
System.Security.Cryptography.Pkcs(GHSA-846f-f764-76mx, GHSA-2fmv-rv2c-59x7) that NimBus packages pulled in. They now depend on 10.0.13, and CI fails on NuGet audit findings. - Added an onboarding guide for customer delivery teams and draw.io diagrams of the platform and the Service Bus topology.
Compatibility
After upgrading, the first event in each session that ever parked a message is parked and drained once, which takes a few seconds and shows as Deferred. Session state gains a replay position and a drain request, and deferred replays now keep DeferralSequence. During a rolling deploy, older workers don't apply the new ordering guard until every instance is upgraded. IMessageContext adds MarkDeferredMessageReplayed, HasUnreplayedDeferredMessages, GetDeferredDrainRequest and SetDeferredDrainRequest, with default implementations that keep the guard off, so custom contexts still compile. Reprocess and purge in the WebApp now rewrite the session state instead of clearing it. A duplicate redelivery of work that already completed now stays Completed: its SkipResponse still appears in the event's history with a Comment audit, but searches for Skipped events no longer find it. In the Functions isolated worker, a message whose session lock was lost is now redelivered, so its handler runs again and the delivery counts against the subscription's max delivery count. The nullability annotations change no runtime behavior, but consumers that build with nullable enabled may see new warnings, which are errors under TreatWarningsAsErrors: for example CloudEvent.Source and CloudEvent.SpecVersion are now string?, IServiceBusManagement.GetSubscription returns a nullable result, and implementations of IResponseService.SendDeadLetterResponse and IMessageLifecycleObserver.OnSessionBlocked must accept the nullable parameters. NimBus packages now depend on System.Security.Cryptography.Pkcs 10.0.13. No schema migration, topology change or wire change.
This release was validated at commit 4f9d244 with the full .NET Release build and 3,845 tests in CI (2 skipped), live Cosmos DB and SQL Server conformance suites with no skipped tests, and Service Bus emulator compatibility checks. The frontend production build and 726 frontend tests passed against the release commit's sources. The CRM ERP end-to-end suite passed 82 of 84 scenarios. The two "resubmitting completed work produces no duplicate business audit" scenarios still fail, as they have since before 4.8.0. The Functions lost-lock fix was checked against the host's production error text in unit tests only, not a live Functions host.
PRs: #260, #261, #262, #263, #266, #267, #268, #269, #270, #271, #272, #273, #274, #276, #277, #278, #279, #280, #281
Commits: v4.8.0...v4.9.0