Skip to content

feat(skill-scan): add LLM model evaluation harness - #913

Open
danbarr wants to merge 3 commits into
mainfrom
skill-scan-model-eval
Open

feat(skill-scan): add LLM model evaluation harness#913
danbarr wants to merge 3 commits into
mainfrom
skill-scan-model-eval

Conversation

@danbarr

@danbarr danbarr commented Aug 26, 2026

Copy link
Copy Markdown
Contributor

Summary

  • add a reproducible harness for comparing skill-scanner LLM models on Dockyard stress skills
  • mine retained CI artifacts for production-model baselines and merge candidate summaries
  • run the scanner ground-truth fixtures through Dockyard production run_scan.py, ensuring the LLM and meta analyzers are included
  • record the 2026-08-26 Sonnet 4.6 versus GPT-5.6 Terra evaluation and its limitations

Why

The skill security scan has experienced nondeterministic finding churn and long tail latency. This tooling makes future model comparisons repeatable across blocking behavior, raw HIGH+ findings, LLM finding-set stability, wall time, token usage, and malicious/safe fixture decisions.

The recall runner intentionally does not use skill-scanner 2.0.13 bundled benchmark_runner.py: that runner constructs the core scanner without enabling the LLM or meta analyzers, so it cannot measure the configured model.

Raw scan outputs and cloned sources remain gitignored because they are large and reproducible. The dated report preserves the durable comparison record.

Validation

  • completed three-run Sonnet 4.6 and GPT-5.6 Terra recall matrices over all 12 scanner fixtures
  • completed three-run model comparisons over all nine Dockyard stress skills
  • compiled all Python files under scripts/skill-scan/eval/
  • ran bench_recall.py --help
  • ran git diff --check

Related to #909.

danbarr and others added 2 commits August 25, 2026 22:23
Tooling to benchmark candidate LLM models for skill-security-scan
against the skills with the worst churn/latency history (#904):

- bench_models.py: runs the CI scan pipeline (run_scan.py unchanged)
  N times per model per skill at the pinned spec.ref, measuring scan
  latency, blocking churn under current allowlists, HIGH+ noise with
  allowlists disabled, and LLM-finding stability (pairwise Jaccard).
  Supports per-provider API keys, resume after interruption, and the
  scanner's consensus-runs knob.
- mine_ci_baseline.py: reconstructs the production-model baseline from
  retained CI scan artifacts instead of re-running paid scans; groups
  by scanned spec.ref, drops cache-hit duplicates, and records scanner
  versions so cross-version noise is not misread as model noise.
- merge_report.py: merges candidate summaries and the mined baseline
  into one comparison table, filtering baseline scans to the scanner
  version the candidates ran on.

Results land in results/ (gitignored); API keys come from .env in this
directory (also gitignored).

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
Run scanner evaluation fixtures through the production scan wrapper so model comparisons include the LLM and meta analyzers. Record the initial Sonnet 4.6 versus Terra evaluation and clarify that finding counts require human review.

Signed-off-by: Dan Barr <6922515+danbarr@users.noreply.github.com>
@toolhive-release-app

Copy link
Copy Markdown
Contributor

🛡️ Skill Security Scan Results

✅ agent-observability-eval-bootstrap

  • Status: Passed
  • Findings: 4
  • Allowed (not blocking): 1
    • MANIFEST_MISSING_LICENSE (Allowed: datadog-labs/agent-skills is licensed MIT at the repository root; upstream does not embed an SPDX license identifier in per-skill SKILL.md frontmatter.)

Summary: Scanned 1 skill(s), all passed security checks. ✅

Signed-off-by: Dan Barr <6922515+danbarr@users.noreply.github.com>
@danbarr
danbarr requested a review from aponcedeleonch August 27, 2026 18:26
danbarr added a commit that referenced this pull request Aug 27, 2026
GPT-5.6 Terra rejects any explicit temperature value, and LiteLLM's
drop_params doesn't catch this for every routing path (see #909).
Auto-derive SKILL_SCANNER_LLM_TEMPERATURE=none when the configured
model name contains gpt-5, matching the workaround already validated
in the eval harness (scripts/skill-scan/eval/bench_models.py, #913).
danbarr added a commit that referenced this pull request Aug 27, 2026
* ci: use dedicated secret for skill scanner LLM key

Per #909, the skill scanner moves to openai/gpt-5.6-terra while the
MCP scanner stays on Anthropic, so they need separate provider keys.
Switches build-skills.yml to the new SKILL_SCANNER_LLM_API_KEY repo
secret instead of the shared MCP_SCANNER_LLM_API_KEY.

* ci: omit LLM temperature for GPT-5.x reasoning models

GPT-5.6 Terra rejects any explicit temperature value, and LiteLLM's
drop_params doesn't catch this for every routing path (see #909).
Auto-derive SKILL_SCANNER_LLM_TEMPERATURE=none when the configured
model name contains gpt-5, matching the workaround already validated
in the eval harness (scripts/skill-scan/eval/bench_models.py, #913).

---------

Co-authored-by: Dan Barr <6922515+danbarr@users.noreply.github.com>
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant