fix(eval): a tool that was never offered is not a tool the model declined #551
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!551
Loading…
Reference in a new issue
No description provided.
Delete branch "fix/a-tool-never-offered-is-not-a-tool-declined"
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?
closes #357
Finding 2 is filed as #549, so this closes #357 on finding 1 rather than leaving a substrate question buried under a shipped fix.
Lucia's finding, and Lucia already landed the pre-run warning. This is the other half.
The defect
A case declaring
required_toolfailed with:whether the model had that tool and ignored it, or the run offered no roster at all. Only the first sentence says anything about the agent. Lucia's words: "A reader seeing
eco-live-status: expected tool ...would reasonably conclude the model failed to use a tool it had. It had none."Why it had not been fixed
CompletionResultcarriedContent,ToolCalls, andServedModel. It never carried what was offered, so the scorer could not tell the two cases apart — they are genuinely identical from the result. Fixing the sentence required the result to know.It carries
OfferedToolsnow, populated from the tools actually sent with the request.The new failure
The count is there deliberately. An empty roster and a populated roster missing one tool fail here identically and are fixed differently — one is "you forgot
SIRENS_ECHO_MCP_ROSTER", the other is "your roster is wrong". Both are pinned.The offered-and-declined path keeps its exact old wording, and a test holds that, because that sentence was always correct and someone may be grepping for it.
Why the warning was not enough
Lucia's pre-run warning names the unservable cases before the run spends completions, which is the better place to catch it. But the warning scrolls past at the top of a run and the failure is attached to the case, in the dataset a reader opens later. The two do different jobs.
ward exec gategreen.