fix(notice): a refused request is not an unavailable backend #893
No reviewers
Labels
No labels
move-to-repo
coilyco-bridge-deploy
move-to-repo
coilyco-flight-deck-agent-compose
move-to-repo
coilyco-gaming-eco-app
move-to-repo
coilysiren-inbox
move-to-repo
unknown
🔒⚠️📦⚠️🔒 SANDBOXED 🔒⚠️📦⚠️🔒
autonomy
async-consult
autonomy
epic
autonomy
headless
autonomy
live-collab
c#
priority
P0
priority
P1
priority
P2
priority
P3
priority
P4
role/ai
role/creator
role/design
role/director
role/engineer
role/exec
role/human
role/ops
role/qa
No milestone
No project
No assignees
1 participant
Notifications
Due date
No due date set.
Dependencies
No dependencies set
Reference
coilyco-gaming/sirens-echo!893
Loading…
Reference in a new issue
No description provided.
Delete branch "aos/claude/hs68-model-rejected"
Deleting a branch is permanent. Although the deleted branch may continue to exist for a short time before it actually gets removed, it CANNOT be undone in most cases. Continue?
The harness half of #875. Not its cause - see the last section, which matters more than this PR does.
What was wrong
A member was told
model backend unavailable, retry shortlywhile DeepSeek was answering every single call and refusing the request this service built.A
modelHTTPErrorwith a 4xx status fell throughturnFailureNotice's type switch to thestageModelfallback, which is the availability notice. So a malformed-request rejection and a genuine outage read identically.The advice could not work. Retrying rebuilt the same malformed message array and drew the same 400. That is the sirens-echo#449 family - a true sentence pointing somewhere useless - and #875's own Ask names it:
The change
rejectedByModelclassifies a 4xx as the backend answering and refusing, ahead of the stage fallback. The member is told the harness built a request the model refused.429and408are excluded, because those are the two 4xx a wait does fix. They stay retryable and keep the availability notice - otherwise this would trade one misdirection for another, and a test pins it.The cause is
model_rejectedrather thanstage_failed, so a malformed-request class is countable on its own instead of collapsing into the stage every model failure shares. That is the same reason #875 went unnoticed: it looked like an availability problem in every aggregate.Tests
TestAMalformedRequestIsNotReportedAsAnOutageTestAnUnavailableBackendStillReportsAsOneTestRateLimitAndRequestTimeoutAreNotRejectionsTestARejectedRequestIsNeverRetriedTestOnlyAModelStatusBecomesARejectionThe part that actually fixes #875, which is not here
The malformed array is built by Agent Proxy's context trimmer, and the fix landed there on 2026-08-13.
sirens-echohas no trimmer - the onlytrimininternal/isstrings.TrimSpace.agent-proxy's1cdf8ecaddedgroup_tool_call_turnsand a pre-dispatchunpaired_tool_messagecheck, which is exactly what #875 asks for.The deployed image is
349dd56, dated 2026-08-12, and does not contain either function:So the P0 needs a rollout: coilyco-bridge/deploy#621,
role/opspriority/P0. Full evidence on #875.This PR does not close #875 and I have not weakened the reference to pretend otherwise. It closes the notice slice, filed as #894, which is worth landing either way: a 4xx reported as an outage would still be wrong after the roll.
The wording is member-facing and Content Creator's to change. I matched the existing phrasing rather than choosing a voice.
just gatepasses.closes #894