[Agent Builder] Fix SkillInvoked evaluator matching a retired tool name - #284661
Merged
patrykkopycinski merged 1 commit intoAug 12, 2026
Conversation
Contributor
Author
|
buildkite test this |
Contributor
Author
|
/ci |
The persona-matrix SkillInvoked evaluator matched only
`attributes.gen_ai.tool.name == "filestore.read"`, but the agent loads
skills via the `load_skill` tool. Verified against the golden cluster
over a 7-day window:
filestore.read -> 0 spans
load_skill -> 7,991 spans
Because `total_tool_spans` is still non-zero for these traces, the
existing "no tool spans -> unavailable" guard does not trip. The
evaluator therefore returned a confident `score: 0` rather than `null`,
silently zeroing the Skill Invoked column for every model in every
persona-matrix run, not just for one model.
`load_skill` arguments carry the same SKILL.md path the existing
predicate already matches:
{"skill":"/skills/platform/evals/eval-experiment-authoring/SKILL.md"}
so only the tool-name check needed widening; no dataset annotations
change. `filestore.read` is retained for backwards compatibility with
older traces.
Verified with a same-trace baseline on real golden-cluster data, holding
the trace and skill predicate fixed and varying only the tool name:
OLD (filestore.read only) total_tool_spans=2 skill_invoked=0
NEW (load_skill accepted) total_tool_spans=2 skill_invoked=1
The added regression test asserts the generated ES|QL includes
`load_skill`; it fails on the pre-fix predicate (confirmed by reverting
the one-line change and re-running: 1 failed, 13 skipped) and passes
after.
patrykkopycinski
force-pushed
the
fix/persona-matrix-skill-invoked-load-skill
branch
from
August 12, 2026 14:22
4a4261b to
99d897e
Compare
Contributor
Author
|
/ci |
Contributor
💛 Build succeeded, but was flaky
Failed CI StepsMetrics [docs]
Test Failures
History
|
patrykkopycinski
marked this pull request as ready for review
August 12, 2026 15:52
Contributor
|
🧪 LLM eval (PR) — Security Persona Matrix ( Failing models:
Triage summary: _Triage summary could not be generated: Inference request failed (503): <title>503 Service Unavailable</title>Error: Service UnavailableService is disabled. See the suite owner notify Buildkite step for details._ |
andrew-goldstein
approved these changes
Aug 12, 2026
qn895
pushed a commit
to qn895/kibana
that referenced
this pull request
Aug 13, 2026
…me (elastic#284661) ## Summary The persona-matrix `SkillInvoked` evaluator matched only `attributes.gen_ai.tool.name == "filestore.read"`, but the agent loads skills via the `load_skill` tool. Verified against the golden cluster over a 7-day window: | tool name | spans (7d) | | --- | --- | | `filestore.read` | 0 | | `load_skill` | 7,991 | Because `total_tool_spans` is still non-zero for these traces, the existing "no tool spans → `unavailable`" guard does not trip. The evaluator therefore returned a confident `score: 0` instead of `null` — silently zeroing the **Skill Invoked** column for every model in every persona-matrix run, not just for one model. This surfaced while generating a matrix column for a model that appeared to never route into any skill. Trace data showed the opposite: it invoked `load_skill` and called security skills directly. The reported zero was a measurement artifact, not a model capability result. ## Why only the tool name changed `load_skill` arguments carry the same `SKILL.md` path the existing predicate already matches: ```json {"skill":"/skills/platform/evals/eval-experiment-authoring/SKILL.md"} ``` so only the tool-name check needed widening. No dataset annotations change. `filestore.read` is retained for backwards compatibility with older traces. ## Verification Same-trace baseline on real golden-cluster data, holding the trace and skill predicate fixed and varying only the tool name: ``` OLD (filestore.read only) total_tool_spans=2 skill_invoked=0 NEW (load_skill accepted) total_tool_spans=2 skill_invoked=1 ``` The added regression test asserts the generated ES|QL includes `load_skill`. It was confirmed to fail on the pre-fix predicate by reverting the one-line change and re-running (`1 failed, 13 skipped`), then pass after restoring. Local gates: ``` tsc : exited with 0 eslint : no eslint errors found jest : 14 passed, 14 total ``` ## Note for reviewers This changes what the Skill Invoked column reports for **all** models. Existing persona-matrix results showing `SkillInvoked = 0` should be treated as unreliable and regenerated rather than compared against post-fix runs. ## Relationship to elastic#283586 This fix is also cherry-picked onto elastic#283586 (`feat/evals-extensions-matrix`), which generates the security LLM performance matrix, so that PR's generated matrix does not ship a Skill Invoked column built from the pre-fix predicate. This PR is the standalone version, based directly on `main`, and can merge independently in either order.
patrykkopycinski
added a commit
to patrykkopycinski/kibana
that referenced
this pull request
Aug 18, 2026
…me (elastic#284661) ## Summary The persona-matrix `SkillInvoked` evaluator matched only `attributes.gen_ai.tool.name == "filestore.read"`, but the agent loads skills via the `load_skill` tool. Verified against the golden cluster over a 7-day window: | tool name | spans (7d) | | --- | --- | | `filestore.read` | 0 | | `load_skill` | 7,991 | Because `total_tool_spans` is still non-zero for these traces, the existing "no tool spans → `unavailable`" guard does not trip. The evaluator therefore returned a confident `score: 0` instead of `null` — silently zeroing the **Skill Invoked** column for every model in every persona-matrix run, not just for one model. This surfaced while generating a matrix column for a model that appeared to never route into any skill. Trace data showed the opposite: it invoked `load_skill` and called security skills directly. The reported zero was a measurement artifact, not a model capability result. ## Why only the tool name changed `load_skill` arguments carry the same `SKILL.md` path the existing predicate already matches: ```json {"skill":"/skills/platform/evals/eval-experiment-authoring/SKILL.md"} ``` so only the tool-name check needed widening. No dataset annotations change. `filestore.read` is retained for backwards compatibility with older traces. ## Verification Same-trace baseline on real golden-cluster data, holding the trace and skill predicate fixed and varying only the tool name: ``` OLD (filestore.read only) total_tool_spans=2 skill_invoked=0 NEW (load_skill accepted) total_tool_spans=2 skill_invoked=1 ``` The added regression test asserts the generated ES|QL includes `load_skill`. It was confirmed to fail on the pre-fix predicate by reverting the one-line change and re-running (`1 failed, 13 skipped`), then pass after restoring. Local gates: ``` tsc : exited with 0 eslint : no eslint errors found jest : 14 passed, 14 total ``` ## Note for reviewers This changes what the Skill Invoked column reports for **all** models. Existing persona-matrix results showing `SkillInvoked = 0` should be treated as unreliable and regenerated rather than compared against post-fix runs. ## Relationship to elastic#283586 This fix is also cherry-picked onto elastic#283586 (`feat/evals-extensions-matrix`), which generates the security LLM performance matrix, so that PR's generated matrix does not ship a Skill Invoked column built from the pre-fix predicate. This PR is the standalone version, based directly on `main`, and can merge independently in either order.
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment
Add this suggestion to a batch that can be applied as a single commit.This suggestion is invalid because no changes were made to the code.Suggestions cannot be applied while the pull request is closed.Suggestions cannot be applied while viewing a subset of changes.Only one suggestion per line can be applied in a batch.Add this suggestion to a batch that can be applied as a single commit.Applying suggestions on deleted lines is not supported.You must change the existing code in this line in order to create a valid suggestion.Outdated suggestions cannot be applied.This suggestion has been applied or marked resolved.Suggestions cannot be applied from pending reviews.Suggestions cannot be applied on multi-line comments.Suggestions cannot be applied while the pull request is queued to merge.Suggestion cannot be applied right now. Please check back later.
Summary
The persona-matrix
SkillInvokedevaluator matched onlyattributes.gen_ai.tool.name == "filestore.read", but the agent loads skillsvia the
load_skilltool. Verified against the golden cluster over a 7-daywindow:
filestore.readload_skillBecause
total_tool_spansis still non-zero for these traces, the existing"no tool spans →
unavailable" guard does not trip. The evaluator thereforereturned a confident
score: 0instead ofnull— silently zeroing theSkill Invoked column for every model in every persona-matrix run, not just
for one model.
This surfaced while generating a matrix column for a model that appeared to
never route into any skill. Trace data showed the opposite: it invoked
load_skilland called security skills directly. The reported zero was ameasurement artifact, not a model capability result.
Why only the tool name changed
load_skillarguments carry the sameSKILL.mdpath the existing predicatealready matches:
{"skill":"/skills/platform/evals/eval-experiment-authoring/SKILL.md"}so only the tool-name check needed widening. No dataset annotations change.
filestore.readis retained for backwards compatibility with older traces.Verification
Same-trace baseline on real golden-cluster data, holding the trace and skill
predicate fixed and varying only the tool name:
The added regression test asserts the generated ES|QL includes
load_skill.It was confirmed to fail on the pre-fix predicate by reverting the one-line
change and re-running (
1 failed, 13 skipped), then pass after restoring.Local gates:
Note for reviewers
This changes what the Skill Invoked column reports for all models. Existing
persona-matrix results showing
SkillInvoked = 0should be treated asunreliable and regenerated rather than compared against post-fix runs.
Relationship to #283586
This fix is also cherry-picked onto #283586 (
feat/evals-extensions-matrix), whichgenerates the security LLM performance matrix, so that PR's generated matrix does not
ship a Skill Invoked column built from the pre-fix predicate. This PR is the standalone
version, based directly on
main, and can merge independently in either order.