skill-upper — independently scanned and version-tracked by SaferSkills.
SaferSkills independently audited skill-upper (Agent Skill) and scored it 96/100 (green). The audit ran 55 deterministic rules across Security, Supply Chain, Maintenance, Transparency, and Community; it found 0 high-severity and 1 lower-severity findings. The full rule-by-rule trace and per-finding evidence are below. Free, methodology-open.
Findings & checks · 1 flagged
The text {match} tells the agent to skip the normal "ask the user first" gate. Used adversarially it removes the human-in-the-loop check before destructive or sensitive actions, turning a normally-gated agent into a fire-and-forget executor.
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.
Help the user evaluate and evolve Agent Skills through the skill-up CLI.
Manual: <https://alibaba.github.io/skill-up/>
Default to English when responding to the user. If the user writes in Chinese (or any other language), switch to that language and stay consistent with the user's input throughout the session.
Detection rules (highest priority first):
Regardless of the response language, technical identifiers in this SKILL — CLI commands, eval.yaml / case.yaml field names, report field names, etc. — MUST stay in their original English form. Do not translate them.
Use the user's current language for replies, newly authored explanatory prose, and YAML comments. Preserve the language and semantics of test inputs, expected output literals, identifiers, commands, paths, and existing regression cases. Do not translate a deterministic assertion merely because the conversation language changed. When testing localized behavior, keep the original business text even in an English conversation.
Treat assets/*.tmpl as structural references: adapt placeholder prose and comments to the requested language. Review only files created or changed for this task; never rewrite unrelated cases to enforce a language preference.
Use short field-leading comments for generated YAML. Explain actual configured fields: schema_version, environment.type, engine.name, cases.files, and report.formats in eval.yaml; id, title, input.prompt, and judge.type in case YAML. For nested fields, place the comment inside the parent mapping immediately before the child field, rather than only before the parent. For example, comment both prompt and type at their own indentation:
input:
# User request sent to the agent.
prompt: Review this code.
# Cheap prerequisites checked before the judge.
expect:
must_contain: ["suggestion"]
judge:
# Deterministic grading strategy for this case.
type: rule_basedComment expect and a top-level judge when present; do not add an optional field just to satisfy a comment check. Keep field names and enum values unchanged. skill-up import does not preserve template comments.
skill-up is an evaluation CLI for Agent Skill authors. It installs the Skill into a real Agent Engine (Claude Code, Codex, qodercli, etc.), spins up an execution environment for each case, runs the prompt, then grades the result via declared rules / LLM judges / custom scripts, and finally produces a report.
Typical layout:
my-skill/
SKILL.md
evals/
eval.yaml
cases/
<case-id>.yaml
fixtures/Use this skill in any of the following situations:
eval.yaml / case.yaml, or asks you to choose an appropriate judge type.skill-up run/validate/list-cases/report/import/init.evals.json to skill-up.evals/eval.yaml or evals/evals.json and the user wants to run it.concrete problems, and propose changes or cases. Do not install tools, create eval files, change configuration, or run evaluations unless requested.
validate its configuration. Stop before credentials and execution unless the user also requests a run. Report the actual config/case paths and validation status in the final reply.
automatically editing the Skill.
scope. Preserve valid existing cases and assertions.
Use this mode when the user asks to record the current Skill interaction or feedback and observation tools are available. It requires either a current Codex release with the codex-skill-up plugin and lifecycle-hook support, or DSH with the skill-up plugin's observer explicitly enabled. Do not retrofit observation capture onto the pinned Codex 0.80.0 evaluation adapter.
If the user asks how to install either host plugin, or the required observation tools are missing and the user asks to enable them, read references/install.md under "Install an observation host plugin (optional)". Do not install or enable a plugin unless the user asks.
Claude Code, qodercli, Qwen Code, and other Agent Engines are not supported for this observation workflow. This restriction does not apply to normal skill-up evaluation runs, which remain multi-engine.
(for example, $my-skill) or the responsible Skill is otherwise known with certainty.
mark_skill_invocation once with the Skill name and optional version. DSH derives exact attribution from its durable /skill injection or successful skill tool result; do not add inferred attribution.
attach_skill_evidence only for references that help reproduce orevaluate the behavior. Prefer paths and short summaries over copied file contents.
record_skill_feedback during the observed turn. In DSH,the observer stores the next user turn in the same session as an unclassified follow-up candidate. For explicit feedback, use record_observation_feedback with the completed observation's ID. Never invent sentiment or comments.
Both adapters redact common credential shapes before local persistence, but still avoid sending secrets to marker tools. If the request is capture-only, stop after recording it; do not edit, evaluate, commit, or publish a Skill unless the user also asks for that work.
When the request starts from a captured Skill observation, read references/observations.md first. Use the available observation tools to inspect and preview the observation, require explicit approval for the exact candidate, write it only after approval, and then continue at Step 4. If the request does not start from an observation, use the normal flow below.
Before doing anything, verify skill-up is available:
command -v skill-up && skill-up --versionIf a version is printed, continue. If you see command not found, on macOS / Linux:
curl -fsSL https://raw.githubusercontent.com/alibaba/skill-up/main/install.sh | bash
export SKILL_UP_VERSION=v0.1.0
curl -fsSL https://raw.githubusercontent.com/alibaba/skill-up/main/install.sh | bash
export INSTALL_DIR="$HOME/bin"
curl -fsSL https://raw.githubusercontent.com/alibaba/skill-up/main/install.sh | bashPlatform: skill-up currently supports macOS / Linux only; Windows is not supported.After installing, run skill-up --version again. If the command is still missing, add ~/.local/bin to PATH.
More details, including optional Codex and DSH observation host plugins: references/install.md.
For OTLP defaults, runtime_kwargs (e.g. OpenSandbox base_url), etc.:
skill-up init
skill-up init --local
skill-up init --print
skill-up init --forcePrecedence (low → high): embedded empty defaults < user config < project .skill-up.yaml < --config. SKILL_UP_CONFIG can point at the user config file (env var name is historical). See the upstream README "User config".
SKILL.md). Search in this priority: user path → nearest SKILL.md upward from CWD → recently viewed files.SKILL.md for scope, triggers, and dependencies. Preserve localized behavior and expected literals when designing cases.evals/:evals/eval.yaml exists → Step 4 (optionally Step 3).evals/evals.json → references/migrate-anthropic.md (skill-up run --auto or skill-up import).assets/eval.yaml.tmpl to <skill-root>/evals/eval.yaml.assets/case.yaml.tmpl to <skill-root>/evals/cases/<case-id>.yaml.Start with the smallest complete scaffold requested by the user. Unless they request broader coverage, create one representative case; add more only for distinct requirements. For a script judge, implement the required output contract in a short script and reuse it across cases with the same contract. Do not build a general report parser or an extensive script test matrix as part of scaffolding. For a JSON-only contract, use json.loads and explicit field checks; support prose or Markdown wrappers only when the contract allows them.
Adapt language per "Language Rules for Generated Artifacts". Replace the templates' generic English placeholders with case-specific prose in the requested output language. Preserve short field-leading comments in generated YAML; translate them when the output language differs from English, while keeping field names and enum values in English.
Selection guidelines:
environment.type: use none for pure-text Skills; use opensandbox when you need a remote sandbox (set OPENSANDBOX_API_KEY, put non-secrets in environment.kwargs).engine.name + engine.model: default claude_code; model is optional. For qodercli, often omit model.judge.type: rule_based (preferred), script, agent_judge (expensive) — see references/judge-types.md..yaml; prompts should exercise real Skill value.input.turns[].content where the user message is known. Use input.turns[].respond only for a reply that must react to the agent, or input.prompt plus case-level user_simulator.scenario when the simulator should choose all later replies and when to stop. Set an independent eval-level user_simulator model and a bounded max_turns; see both YAML references. Do not reuse engine.model or judge.model as an implicit simulator model.See references/eval-yaml.md and references/case-yaml.md.
skill-up list-cases <path>eval.yaml and representative cases; avoid agent_judge abuse.cases/ as needed.sha256sum <file> (orshasum -a 256 <file>) before and after editing, within the user's allowed command profile.
skill-up validate <skill-root>/evals/eval.yamlExpect: ✓ eval.yaml is valid (loaded N case(s)).
For a case-authoring request, finish here with the config and case paths plus validation status. Do not start a background evaluation as part of scaffolding. Before replying, reopen the generated YAML and check comments immediately before nested input.prompt, judge.type, and report.formats where configured. A comment before input, judge, or report does not document its child field. Check every generated case separately: read its actual judge: block and ensure the explanatory comment sits between judge: and type:, indented like type:. If the comment is above judge:, move it inside the mapping and validate again. Do not infer comment coverage from a successful YAML validation or from what you intended to write. For an expect block, put its explanatory comment immediately above expect:; a comment inside it above must_contain does not document the parent gate. For a new scoring script, check one passing and one failing sample when feasible, then report the checks and finish. Do not expand into unrelated script features or a large test matrix unless the user asks for that work.
Check authentication for the selected engine and provider. Provider API keys resolve from --api-key, environment variables, or ~/.skill-up/credentials.yaml; engine-specific tokens and saved login sessions follow the engine's auth rules. Never dump environment variables or credential files, or print secret values into tool output, logs, or the conversation. Check only whether a relevant variable has a non-empty value. For example, for an OpenAI API-key workflow:
if printenv OPENAI_API_KEY | grep -q .; then
printf '%s\n' 'OPENAI_API_KEY: configured'
else
printf '%s\n' 'OPENAI_API_KEY: not configured in the environment'
fiAn absent environment variable does not rule out file-based credentials or an existing engine login. If the selected authentication path is unavailable, stop and ask the user to configure it locally; do not ask them to paste a secret into the conversation or write secrets into YAML without consent.
When asked to author a credential probe, respect the user's allowed command profile during verification too. Writing a script does not authorize launching it with sh, sh -x, or sourcing it when that profile excludes script execution. Inspect the written probe instead and report that execution was not performed; do not add an unsupported launcher just to test it. Check shell-tracing behavior only in an explicitly permitted isolated test with synthetic credentials.
The user simulator resolves credentials by its own user_simulator.provider. For provider: simulation, set SIMULATION_API_KEY and SIMULATION_BASE_URL, or configure the simulation provider in ~/.skill-up/credentials.yaml. For provider: openai, use OPENAI_API_KEY and optionally OPENAI_BASE_URL; its standard endpoint is the fallback. Choose protocol: openai for Chat Completions or protocol: anthropic for Messages; custom base URLs must match that protocol. For provider: anthropic with protocol: anthropic, use ANTHROPIC_API_KEY and optional ANTHROPIC_BASE_URL (official endpoint fallback). --api-key for the agent does not supply the simulator connection. Never put a raw key in eval YAML.
For opensandbox, also ensure OPENSANDBOX_API_KEY (and related env) as needed.
skill-up run <skill-root>/evals/eval.yaml| Scenario | Command |
|---|---|
| Subset | --include-case-name "basic-*" |
| Exclude | --exclude-case-name "*-flaky" |
| HTML report | --format html |
| Engine override | --engine codex --model openai/gpt-4 |
| Parallelism | --parallelism 4 (1–256) |
| Anthropic JSON | --auto |
| Stability/flakiness sampling | --iteration 3 |
| Auto-append after last iteration | --iteration 0 (default behavior) |
| Verbose | -v, -vv |
Exit 0 = all passed; 1 = failure or error — suitable for CI. When an explicit positive --iteration N runs more than one sample, inspect the terminal's simple current-command summary for lines like case_a: 3 trials, 2 PASS, 1 FAIL -> flaky.
Artifacts under <skill-root>/<skill-name>-workspace/iteration-N/:
result.json, benchmark.json, optional report.html<case-id>/with_skill/grading.json, outputs/Summarize: pass rate and timing; for failures, case id, assertion text, and evidence; benchmark deltas if enabled; offer HTML path or skill-up report result.json --format html. For simulated cases, inspect each turn's source and any stop_reason alongside the transcript. Hitting max_turns is an execution error; a simulator stop does not itself mean PASS, because the configured judge still grades the result.
Only enter this loop when the user asks to fix, improve, iterate, or evolve the target Skill. If the user only asks to evaluate or report results, stop after Step 7 without modifying it.
result.json, grading.json, and output evidence.SKILL.md or supporting files when the Skill behavior is incorrect.| Command | Purpose |
|---|---|
skill-up validate <eval.yaml> | Validate before run. |
skill-up list-cases <eval.yaml> | List cases. |
skill-up run [eval.yaml] | Run evals. |
skill-up run --auto | Run from evals/evals.json. |
skill-up report <result.json> --format html | Re-render reports. |
skill-up import <evals.json> | Convert Anthropic format to YAML. |
skill-up init | Write user-config template. |
skill-up debug judge <input.json> | Debug judge. |
skill-up debug report <input.json> | Debug report. |
Full flags: references/cli.md.
base_url.opensandbox without OPENSANDBOX_API_KEY — auth failures.agent_judge.evals.json expectations → default agent_judge; use import + hand edits for deterministic checks.SKILL.md directory).{{placeholders}}; captured-variable substitution belongs only in configured fixed turns and respond instructions.--iteration 0 appends one run after the latest existing iteration withoutsummarizing history; positive --iteration N runs N samples of the selected cases and, when N > 1, prints a simple stability/flakiness summary covering only samples from the current command.
references/install.mdreferences/eval-yaml.mdreferences/case-yaml.mdreferences/judge-types.mdreferences/cli.mdreferences/migrate-anthropic.mdreferences/observations.mdassets/eval.yaml.tmpl, assets/case.yaml.tmpl~30 seconds. Free. No account. Every finding cites a rule and a line of evidence.