Gate Your CI
Turn SkillEvaluator into a merge gate for your skill repository. The recommended gate runs entirely offline — no API key, no network calls beyond installing the tools — so you can adopt it in any CI system today and layer LLM-backed checks on later.
Exit codes
skillevaluator validate communicates pass/fail through its exit code, so a plain run: step is already a gate — no output parsing required.
Tier 1 checks gate the exit code — and so do Tier 2 deduplication findings when dedup runs (the recommended gate below disables it with --no-dedup). Tier 3 live-evaluation results are always advisory inside validate: they appear in the reports but never flip a passing run to 1. That means you can layer Tier 3 on later without destabilizing the gate.
The recommended gate
Each flag earns its place:
--externalpins the public-publication profile explicitly instead of relying on the environment, so the gate behaves identically on every runner. The active profile name is stamped into the HTML report andBENCHMARK.md(and printed in the run banner with--verbose), so a run always records which gate was applied.--no-dedupskips Tier 2, which needs an embedding-capable provider key (--no-tier2is an equivalent alias). Without it the run is fully keyless and hermetic. Drop this flag once you add a provider secret.-r json,markdownwrites a machine-readable report for your pipeline and a Markdown report you can post as a PR comment.-o reportscollects everything in one directory for artifact upload.--min-score 70is the default quality bar, written out explicitly so raising it later is a visible one-line diff.
GitHub Actions recipe
A complete workflow: install with uv, add the external Semgrep, SkillSpector, and Gitleaks scanners for a complete security result, validate, upload the reports, and post the Markdown report on the pull request.
The security extra installs Bandit and pip-audit. Semgrep and SkillSpector
stay in separate uv tool environments, while Gitleaks is installed from its
official releases. Report
filenames embed a sortable timestamp (skillevaluator-output-<timestamp>.md),
which is why a lexicographic sort finds the newest one. The if: always()
conditions keep reports flowing even when validation fails — which is exactly
when you want them.
The same shape ports to any CI system: install, run validate, gate on the exit code, archive reports/.
Validating collections
Point validate at a folder of skills and it validates each one:
Two flags control how a multi-skill run behaves:
-c overrides --fail-fast if both are passed. For a merge gate, prefer -c: contributors get the complete picture in one run instead of a fix-push-repeat loop.
Adopt progressively
You do not have to turn on the strictest gate on day one. A path that works well:
Start advisory
Run the gate but never fail the build. Contributors see reports and get used to the findings before anything blocks a merge.
Gate on Tier 1
Remove the || true. Exit code 1 now blocks merges on schema, security, PII, license, code-integrity, Unicode, and quality failures — all still keyless. (The lint check also runs, but its findings are advisory warnings and never fail validation.)
Raise the quality bar
Bump --min-score above the default 70 once your collection consistently clears it. The score and grade in each report tell you where the collection stands before you move the line.
Add LLM-backed checks
Add a provider key as a masked CI secret, set SKILL_EVAL_LLM_PROVIDER, then add --llm (and --llm-verify to suppress false positives) and drop --no-dedup so Tier 2 overlap checks run too. Note that once dedup runs, its findings gate the exit code alongside Tier 1. See Providers & Credentials for provider setup.
Add an advisory Tier 3 job
Run live agent evaluation as a separate, non-blocking job — either skillevaluator tier3 evaluate on its own or validate --tier3 (--agent-eval is a supported compatibility alias and is not currently deprecated; validate --full runs Tier 1+2+3 in one shot). Tier 3 results never gate validate’s exit code; the standalone tier3 evaluate exits non-zero only when the run itself fails to complete. Expose agent credentials as CI secrets in the job environment — the env: block of the workflow step — because SkillEvaluator reads operator credentials from the host environment only. With the nv_build provider and --env-mode docker, a single NVIDIA_API_KEY secret covers the evaluator and all three agents. See Tier 3: Live Evaluation.
Keep provider and agent keys as masked CI secrets in the job environment — never in the repo or in evals/config.yml. SkillEvaluator enforces this: a harbor.runtime_env entry that names or ${VAR}-references an operator-owned credential (such as OPENAI_API_KEY or NVIDIA_API_KEY) fails the Tier 3 run with a hard error.
Custom policy in CI
If the default external profile is too loose or too strict for your repository, commit a policy overlay next to your skills and pin it in the gate. Severity decisions then get reviewed like code:
The policy overlays the external profile, and the resulting profile name is stamped into the HTML report and BENCHMARK.md (and printed in the run banner with --verbose) — so a run always tells you which gate produced it. Full overlay syntax is on the Tier 1: Validation page.
Parse the JSON
When the exit code is not enough — dashboards, custom thresholds, badge generation — read reports/skillevaluator-output-<timestamp>.json. The fields CI cares about sit at the top level:
A step that enforces a stricter score than the built-in gate:
jq -e exits non-zero when the expression is false, so the step fails the job on its own. For Tier 3 payloads and the full results-on-disk layout, see Reports & Results.
Troubleshooting
The run exits 2 instead of 1
Exit code 2 is a configuration error — a bad flag or an unreadable target path. Fix the pipeline; the skill was never judged. (Passing --llm without a configured provider does not exit 2: the LLM-backed scanner is marked incomplete and the run fails with 1.)
overall_status is 'incomplete'
A required scanner is missing or returned no evidence. Check the report for
the named scanner: Semgrep, SkillSpector, and Gitleaks are all separate
executables, and the security extra alone does not install them. The
scanners fail closed: validate exits non-zero and the report stays
non-green until every required scanner is installed and returns valid
evidence. See the workflow above or
Installation: System tools.
The report artifact is empty
Make sure the artifact path matches your -o directory and that the upload step carries if: always() — otherwise a failed gate skips the upload, and you lose the report exactly when you need it.
Next steps
What every report format contains and how to read scores, severities, and Tier 3 payloads.
Every check behind the gate — what it inspects and how to fix findings.
Add an LLM provider to unlock --llm, Tier 2 dedup, and Tier 3.
The complete flag reference for validate and every other command.