skill-eval-pipeline — independently scanned and version-tracked by SaferSkills.
SaferSkills independently audited skill-eval-pipeline (Agent Skill) and scored it 100/100 (green). The audit ran 55 deterministic rules across Security, Supply Chain, Maintenance, Transparency, and Community; it found 0 high-severity and 0 lower-severity findings. The full rule-by-rule trace and per-finding evidence are below. Free, methodology-open.
Findings & checks · 0 flagged
Every scanned point with the score it earned and what moved between them.
First recorded scan — no prior version to compare against.
The primary manifest — the file an agent reads to learn what this artifact does.
Coordinator/dispatcher orchestrator for the multi-agent skill evaluation pipeline. This agent does NOT perform evaluation work itself — it dispatches sub-agents in order, monitors shared state via the workspace file tree, and enforces gating decisions between stages.
The pipeline uses a Coordinator/Dispatcher pattern: a single orchestrator agent dispatches 7 specialized sub-agents in a Sequential Pipeline with Parallel Fan-Out at key stages. Agents communicate exclusively through the shared workspace file tree — there is no direct messaging between sub-agents. See state-protocol.md for the complete workspace schema and multi-agent-patterns.md for the architectural patterns applied.
┌─────────────────────────┐
│ skill-eval-pipeline │
│ (Orchestrator) │
└────────────┬────────────┘
│
┌────────────────────────────┼────────────────────────────┐
│ │ │
▼ ▼ ▼
┌─────────────────┐ ┌─────────────────┐ ┌─────────────────────┐
│ struct-validator │ │ Stage Gate │ │ Shared State │
│ (Agent 1) │───────▶│ pass → continue │───────▶│ evals/workspace/ │
│ │ │ fail → ABORT │ │ state.json │
└─────────────────┘ └─────────────────┘ └──────────┬──────────┘
│
┌─────────────────────────────────────────────┘
│
▼
┌──────────────────────────────┐
│ trigger-evaluator │
│ (Agent 2) │
│ ┌──────────┬──────────┐ │
│ │ opencode │ gemini │ │ ◄── Parallel Fan-Out
│ │ 3x runs │ 3x runs │ │
│ └──────────┴──────────┘ │
└──────────────┬───────────────┘
│
▼
┌──────────────────────────────┐
│ trigger-aggregator │
│ (Agent 3) │
│ 60/40 split → desc optimize │
└──────────────┬───────────────┘
│
┌─────────┼─────────┐
│ Gate │ │
│ rates │ │
│ < 0% │ │
│ WARN │ │
└─────────┘ │
│ │
▼ ▼
┌──────────────────────────────┐
│ quality-evaluator │
│ (Agent 4) │
│ ┌────────┬────────┐ │
│ │without │ with │ │
│ │ skill │ skill │ │
│ └────────┴────────┘ │
└──────────────┬───────────────┘
│
▼
┌──────────────────────────────┐
│ output-grader │ ◄── Generator-Critic:
│ (Agent 5) │ quality-evaluator
│ LLM judge → grading.json │ generates, grader
│ + benchmark.json │ critiques
└──────────────┬───────────────┘
│
┌─────────┼─────────┐
│ Gate │ │
│ delta │ │
│ ≤ 0 │ │
│ ABORT │ │
└─────────┘ │
│ │
▼ ▼
┌──────────────────────────────┐
│ revision-synthesizer │
│ (Agent 6) │
│ ┌──────┬──────┬──────┐ │ ◄── Parallel Fan-Out
│ │ RevA │ RevB │ RevC │ │ 3 variants
│ └──────┴──────┴──────┘ │
│ + skills-ref self-validate │
└──────────────┬───────────────┘
│
▼
┌──────────────────────────────┐
│ candidate-selector │
│ (Agent 7) │
│ re-eval all → composite │
│ score → select best │
│ → selected-SKILL.md │
└──────────────┬───────────────┘
│
▼
┌──────────┐
│ OUTPUT │
│ winning │
│ SKILL.md │
└──────────┘| Stage | Agent | Depends On | Parallel? |
|---|---|---|---|
| 1. Structural Validation | struct-validator | — | No |
| 2. Trigger Evaluation | trigger-evaluator | Stage 1 pass | Yes (opencode ∥ gemini) |
| 3. Trigger Aggregation | trigger-aggregator | Stage 2 complete | No |
| 4. Quality Evaluation | quality-evaluator | Stage 2+3 complete | No |
| 5. Output Grading | output-grader | Stage 4 complete | No |
| 6. Revision Synthesis | revision-synthesizer | All prior stages | Yes (3 variants ∥) |
| 7. Candidate Selection | candidate-selector | Stage 6 complete | No |
All state is persisted to evals/workspace/state.json. The orchestrator reads this file at startup to determine:
{
"stage": "trigger",
"status": "running",
"skill_path": "packages/my-skill/skills/my-skill/SKILL.md",
"revision_strategy": "balanced",
"struct_validation": "pass",
"trigger_eval_opencode_complete": true,
"trigger_eval_gemini_complete": true,
"optimized_description_available": false,
"quality_iteration": 1,
"grading_complete": false,
"revision_count": 0,
"selected_variant": null,
"improvement_over_original": null,
"errors": [],
"warnings": [],
"started_at": "2026-05-16T12:00:00Z",
"updated_at": "2026-05-16T12:02:00Z"
}To resume an interrupted pipeline:
evals/workspace/state.json.status is running, identify stage and dispatch from the next incomplete stage.status is aborted, report the abort reason and exit — do not resume.status is complete, report the selected variant and exit.struct-validation.json has "status": "pass" → proceed to Stage 2."status": "fail" → ABORT. Set state.json status to aborted. A structurally invalid skill cannot be meaningfully evaluated. Report errors to the user.skill_delta > 0 in benchmark.json → proceed to Stage 6.skill_delta <= 0 → ABORT. The skill adds no measurable quality and revision is unlikely to help. Flag as "recommendation": "skill_adds_no_value"."recommendation": "keep_original".Sub-agents are defined in .apm/agents/ and dispatched via the orchestrator's task tool:
dispatch: task(
subagent_name: "struct-validator",
description: "Run structural validation",
prompt: "Validate the skill at <skill_path>. Read from evals/workspace/state.json for the skill_path. Write results to evals/workspace/struct-validation.json."
)Each dispatch must:
skill_path in the prompt (read from state.json).revision_strategy for the revision synthesizer).The trigger evaluator runs opencode and gemini internally as parallel fan-out. Dispatch the single trigger-evaluator agent — it handles both CLIs internally. This avoids the orchestrator needing to manage parallel sub-agent dispatch.
Dispatch the single revision-synthesizer agent — it generates all 3 variants internally. The orchestrator does not need to dispatch 3 parallel agents.
| Failure Mode | Action |
|---|---|
| Structural validation fails | ABORT immediately. Report errors. No further stages run. |
| CLI not available (binary missing) | WARN in trigger results. Continue with available CLI. |
| All trigger activations == 0 | WARN. Continue to quality evaluation. Flag for manual review. |
| Quality delta <= 0 | ABORT. Skill adds no measurable value. Revision cannot fix this. |
| Quality evaluator timeout (>180s per run) | Record timeout, mark test case as failed, continue to next case. |
| Revision fails self-validation | Retry up to 2 times. If all retries fail, skip that variant. |
| Candidate selector finds no improvement | Select original. Pipeline completes normally with keep_original. |
| File not found (missing eval output) | ABORT current stage. Report which file is missing. |
evals/workspace/ directory. Write initial state.json with skill_path, stage: "init", status: "running".skills-ref is available. Check at least one CLI (opencode, gemini) is on PATH. Check evals/evals.json exists.struct-validator. Gate: pass → continue, fail → abort.trigger-evaluator. Runs opencode and gemini in parallel internally.trigger-aggregator. Gate: any activation > 0 → continue, all zero → warn but continue.quality-evaluator. Runs all test cases with-skill and without-skill.output-grader. Gate: delta > 0 → continue, delta ≤ 0 → abort.revision-synthesizer. Generates 3 variants with self-validation.candidate-selector. Re-evaluates all candidates, selects best.selected-SKILL.md exists. Write final state as "status": "complete". Report summary.trigger-evaluator has a 30-minute timeout. If the eval suite has many queries (e.g., 20 queries × 2 CLIs × 3 runs = 120 CLI invocations), this may be insufficient. Monitor progress and increase timeout if needed.quality-evaluator has a 45-minute timeout. Long test cases can consume this quickly.opencode and gemini require valid API keys. The orchestrator should verify $OPENCODE_API_KEY or $GEMINI_API_KEY is set before dispatching sub-agents. If missing, abort with a clear message.evals/workspace/ can grow large (multiple quality eval iterations with full output files). Before starting a new pipeline run, clean the workspace: rm -rf evals/workspace/*compute-benchmark and select-best Go tools must be compiled and available at ./bin/compute-benchmark and ./bin/select-best (repo root). If not present, the candidate-selector will fail. Verify these exist before starting the pipeline.~30 seconds. Free. No account. Every finding cites a rule and a line of evidence.