fix: ship a well-formed reply a quality rule refused #914
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!914
Loading…
Reference in a new issue
No description provided.
Delete branch "issue-651-ship-well-formed-replies"
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?
Implements Kai's decision: a well-formed reply the model finished normally is no longer discarded by a validator rejection.
The split, which is the reviewable part
Checks divide on what the reply would cost a member, not on which rule fired.
response_style,tool_call_markup. Both are about how an answer reads.parse, the fourgroundingrules,self_attributed_claim,identifier_disclosure,identity_claim.checkGatesreads an allowlist rather than a blocklist, so a rule nobody classified gates. A new check has to be argued into the quality tier rather than falling into it.The two judgement calls, stated so they are easy to disagree with:
self_attributed_claimgates for the same reason.Moving a check between tiers is one line in
qualityChecks.Both layers
ErrResponseRepairExhaustedwhen the outstanding refusal is quality. This is the path the issue's trace took.Telemetry
model.response.shippedat the proxy,response.check.shippedon theresponse.validatespan and log, both carrying the rule and the reason. A gating refusal is byte-identical: same notice, samefailure_cause, same exception fields.Tests
replyshipping_test.go- a quality refusal reaches the member and names its rule, a blast-radius refusal does not, and the fail-closed default is asserted over every check including an invented future one.repairnotice_test.go- the four criterion-1 tests keep every assertion and move to a gating fixture, since a style refusal no longer exhausts repair. AddedTestTheAnswerFromTheTraceNowReachesTheMember: the verbatim answer from the trace is returned rather than discarded.TestProxyClientRejectsPersistentStyleViolationrenamed to...Ships...and inverted. That is the behaviour the decision reverses.TestAGenuineBackendFailureStillReportsAnOutageuntouched and passing.One thing worth reviewing
docs/sirens-echo-delivery.mdwas at its 8,000-char cap, so four restatements elsewhere on the page were compressed to make room. No live fact was dropped, but the diff touches prose this change is not about.What #675 still owns
The false
model backend unavailablefor the paths that do still fail. Unchanged here.closes #651