Fail loudly when delivery feedback cannot reach the session - #2004
Merged
Conversation
Aaronontheweb
force-pushed
the
refactor/delivery-failure-drift
branch
from
August 19, 2026 02:08
825233e to
2f48c30
Compare
Aaronontheweb
marked this pull request as ready for review
August 19, 2026 02:09
Aaronontheweb
force-pushed
the
refactor/delivery-failure-drift
branch
from
August 19, 2026 02:51
2f48c30 to
918cd9d
Compare
Aaronontheweb
force-pushed
the
refactor/delivery-failure-drift
branch
from
August 19, 2026 03:39
918cd9d to
2f48c30
Compare
Discord and Mattermost swallowed a SendFeedbackAsync failure inside NotifyDeliveryFailedAsync. Slack already rethrows to force a supervised restart and a pipeline reinit. The swallowed path left a zombie session: the session waited on a delivery report that never arrived. Align Discord and Mattermost with the Slack behavior. The rethrow fires only when the feedback pipe itself fails. A normal transport failure still takes the notify-and-return path. Add a cross-channel contract test that drives a post failure into a feedback pipe failure and asserts a supervised restart re-creates the pipeline. The test passed on Slack and failed on Discord and Mattermost before the fix.
Aaronontheweb
force-pushed
the
refactor/delivery-failure-drift
branch
from
August 19, 2026 12:26
2f48c30 to
bac0f84
Compare
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.
What
Phase 3 of the code-reduction stack (on top of #2002). Fixes a confirmed behavioral drift between channel binding actors, found while diffing the triplicated code for this refactor series.
The drift:
NotifyDeliveryFailedAsyncsendsDeliveryFailedfeedback to the session when a transport post fails. If that feedback send itself throws:CommandAsynchandler, supervision restarts the actor, and recovery re-creates the pipeline (the comment documents this intent).The fix: align Discord and Mattermost with Slack's log-and-rethrow. Blast radius is narrow — the rethrow fires only when the session feedback pipe is already dead. An ordinary transport failure (a post that fails) still takes the normal notify-and-return path.
Test
New cross-channel contract test
Feedback_send_failure_faults_the_actorinSessionBindingContractTests, which runs against all three channels:RecordingSessionPipeline.FeedbackException, new test hook)CreateAsynccall (newCreateCountcounter)Verification
Netclaw.Actors.Tests: 3,442 passed, 0 failed, 1 skipped (pre-existing Windows-only skip)dotnet slopwatch analyze: 0 issues; header verification passesStack
PR 3 of 4. Base:
refactor/channel-warmups(#2002). Next: binding-actor consolidation (gap-hydration engine + approval flow).