Every check agent-proxy makes is structured in its logs and prose in its responses, so no caller can react to any of them #125
Labels
No labels
autonomy
async-consult
autonomy
epic
autonomy
headless
autonomy
live-collab
coherence-core
priority
P0
priority
P1
priority
P2
priority
P3
priority
P4
qa-fixture
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-flight-deck/agent-proxy#125
Loading…
Reference in a new issue
No description provided.
Delete branch "%!s()"
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?
Raised by Kai after a day of tracing: "aproxy and litellm have a bunch of boundaries and checks that they aren't communicating to sirens echo in a structured way." This is the agent-proxy half. The cross-cutting version is a tracker in
coilyco-gaming/sirens-echo.Restating #108's own framing — "aproxy doesn't know how to communicate that limitation / state" — with the specific mechanism: the state is already known and already structured. It goes to SigNoz. It does not go into the response.
The asymmetry
agent-proxy emits richly typed telemetry for every decision it makes:
Six typed fields describing a payload mutation. An attempt counter. A backend name. All of it queryable, none of it in the HTTP response.
What the caller got for that same request:
A status code and a sentence with an MDN link in it. Nothing a program can branch on.
Structure is destroyed at each hop
DeepSeek answered with a typed object:
AllBackendsFailed: ...and returned 502.error_type: model_failed.model backend unavailable, retry shortly.Four hops. A machine-readable
codeat hop zero; prose pointing at the wrong system by hop four. Every hop had the information and every hop dropped its shape.What callers currently cannot determine
status_messageSix of those seven are already known inside agent-proxy at the moment it answers.
The trimming case is the sharpest
request.prompt_trimmedfires on the request path and the caller is never told. In every observed instance the request then failed (#113), so the silence has been academic — but the design is that agent-proxy can silently rewrite the message array a caller constructed and return 200, and the caller would attribute any resulting weirdness to the model. A caller cannot reason about a conversation it does not know was edited.Proposal
A typed envelope alongside the existing prose, on both paths.
Failure:
Success, when the request was altered:
reasonshould be a closed enumeration, documented, and stable — that is the whole value.retryableshould be stated by the proxy, which knows, rather than guessed by the caller from a string.This composes with #104 rather than competing: heartbeats carry in-flight state on streaming requests, this carries terminal state and applies to non-streaming too.
What I am not claiming
reason, honestretryable, upstream status/code preserved, and request mutations disclosed.coilyco-gaming/sirens-echo#651, where a harness-internal check rejected two correct answers and logged onlyattempt: 1). agent-proxy is the highest-leverage place to start because it sits in the middle and holds the most checks.Acceptance
reasoncode.retryableis asserted by the proxy.AllBackendsFailedappears only when more than one backend was attempted (also #114).Related
coilyco-gaming/sirens-echo#137— a validator rejection reaching the caller as 502.coilyco-gaming/sirens-echo#651— the same disease inside the harness.coilyco-gaming/sirens-echo, filed alongside this.Next owner
Engineer, after the schema call.