Adopt JasperFx 2.39.3 and release 9.22.4 - #5189
Merged
Merged
Conversation
#631 — a status transition published while the shard has NO progression row to decorate landed nowhere, because every store's extended-progression write is update-only. That describes every fresh shard's Started: the agent starts before its first batch commits. With the periodic beat off by default since #622 there was no later write to correct it, so agent_status and heartbeat stayed NULL for the entire life of a healthy agent. The shard is now remembered and written again on the first publication carrying a committed sequence, which is proof the row exists. The #630 follow-up: a duplicate ExtendedProgressionWriter on one database now logs a warning. It used to announce itself as lock contention -- two writers issuing multi-row UPDATEs over the same rows in plan-dependent order is a deadlock hazard. The one-row-per-transaction rewrite in #5186 made a duplicate harmless to correctness and therefore SILENT, while it still means two projection daemons are started for one database. Reported and not refused: the duplicate writer is the symptom, not the bug. Version bumped to 9.22.4 for the release. DaemonTests 301/301 green on net9.0. Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_017CTtw2kVRSZKp1p5RTxgAy
This was referenced Aug 5, 2026
Open
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment
Add this suggestion to a batch that can be applied as a single commit.This suggestion is invalid because no changes were made to the code.Suggestions cannot be applied while the pull request is closed.Suggestions cannot be applied while viewing a subset of changes.Only one suggestion per line can be applied in a batch.Add this suggestion to a batch that can be applied as a single commit.Applying suggestions on deleted lines is not supported.You must change the existing code in this line in order to create a valid suggestion.Outdated suggestions cannot be applied.This suggestion has been applied or marked resolved.Suggestions cannot be applied from pending reviews.Suggestions cannot be applied on multi-line comments.Suggestions cannot be applied while the pull request is queued to merge.Suggestion cannot be applied right now. Please check back later.
Adopts JasperFx 2.39.3 and bumps the Marten version to 9.22.4 for release.
What 2.39.3 brings
#631 — a status transition with no progression row to land on is written again. Every store's extended-progression write is update-only, so a transition published while the shard has no progression row simply lands nowhere. That is every fresh shard's
Started: the agent starts before its first batch commits. With the periodic beat off by default since #622, there was no later write to correct it — soagent_statusandheartbeatstayed NULL for the entire life of a healthy agent. Such a shard is now remembered and written again on the first publication carrying a committed sequence, which is proof the row exists.#630 follow-up — a duplicate
ExtendedProgressionWritersays so. A second writer on one database used to announce itself as lock contention: two writers issuing multi-row UPDATEs over the same rows in plan-dependent order is a deadlock hazard. The one-row-per-transaction rewrite in #5186 made a duplicate harmless to correctness and therefore silent — while it still means more than one projection daemon has been started for that database.ShardStateTrackernow logs a warning when a second one attaches. Reported and never refused: the duplicate writer is the symptom, not the bug, and swallowing the subscription would hide the lifecycle bug rather than surface it. Unsubscribing removes the listener, so an ordinary daemon restart does not trip it.Together with #5186 (per-row progression writes) and #5176 (the beat off by default), this closes out the #5167 line of work.
Verification
Built and tested against the published 2.39.3 packages (all five).
DaemonTests— 301/301 green, net9.0🤖 Generated with Claude Code
https://claude.ai/code/session_017CTtw2kVRSZKp1p5RTxgAy