discord.turn.failed classifies stage failures as Discord delivery failures #802

Closed
opened 2026-08-15 15:39:34 +00:00 by coilyco-ops · 0 comments
Member

Split from #292, whose first acceptance criterion this completes. 292 stays open on its second.

The defect

discord.turn.failed fires when the turn returned any error, and it applies the send classifier to that error regardless of whether a send was ever attempted. A model stage failure is neither a context error nor a RESTError, so it falls through to the catch-all and reports no_response - the value whose documented meaning is that no HTTP exchange happened and the gateway went quiet.

Measured on 292

Thirteen of fourteen classified rows in one 24 hour window were turns that failed at a stage and never reached a send. That is why every sample on the series read no_response and not one ever read rest_error. The catch-all was collecting errors that never touched Discord.

Same window: discord.reply.failed, the event that fires when a send actually failed, fired zero times against 366 accepted turns.

The shape

docs/sirens-echo-indistinguishable-values.md names it. A reader cannot tell a real gateway drop from a model stage failure, because both produce a plausible present value rather than a distinct state. Nothing errors and no gate goes red.

Acceptance

  • discord.turn.failed carries a Discord verdict only where one exists.
  • A turn that failed for any other reason is distinguishable from one whose send failed.
  • The distinction is pinned by a test that fails if the classifier is applied to the turn error again.
Split from https://forgejo.coilysiren.me/coilyco-gaming/sirens-echo/issues/292, whose first acceptance criterion this completes. 292 stays open on its second. ## The defect `discord.turn.failed` fires when the turn returned any error, and it applies the send classifier to that error regardless of whether a send was ever attempted. A model stage failure is neither a context error nor a `RESTError`, so it falls through to the catch-all and reports `no_response` - the value whose documented meaning is that no HTTP exchange happened and the gateway went quiet. ## Measured on 292 Thirteen of fourteen classified rows in one 24 hour window were turns that failed at a stage and never reached a send. That is why every sample on the series read `no_response` and not one ever read `rest_error`. The catch-all was collecting errors that never touched Discord. Same window: `discord.reply.failed`, the event that fires when a send actually failed, fired zero times against 366 accepted turns. ## The shape `docs/sirens-echo-indistinguishable-values.md` names it. A reader cannot tell a real gateway drop from a model stage failure, because both produce a plausible present value rather than a distinct state. Nothing errors and no gate goes red. ## Acceptance - `discord.turn.failed` carries a Discord verdict only where one exists. - A turn that failed for any other reason is distinguishable from one whose send failed. - The distinction is pinned by a test that fails if the classifier is applied to the turn error again.
Sign in to join this conversation.
No milestone
No project
No assignees
1 participant
Notifications
Due date
The due date is invalid or out of range. Please use the format "yyyy-mm-dd".

No due date set.

Dependencies

No dependencies set

Reference
coilyco-gaming/sirens-echo#802
No description provided.