Skip to main content
Commands are instructions, not implicit permission to execute. A command template tells a harness or agent what invocation to consider; the harness still applies its own safety and approval policy before anything runs. Dependencies are contracts, not grants — declaring a cli dependency does not install it, and declaring a local_write safety class does not authorize the mutation. Both constructs exist to make the skill’s assumptions explicit and inspectable.

Commands

Commands are named instruction templates. They belong in the commands mapping and are referenced by states, rules (after_success), recipes (run_command), and route checks.

Safety Classes

Safety class is a declaration, not enforcement. It gives the harness a concrete pre-tool-call classification. Rules can route around unsafe commands. Commands must not route around rules.

Command Templates

template is a string pattern, not a shell command. v0 does not mandate a template engine. Implementations should treat the template as a concrete example unless they explicitly support rendering with a variable substitution syntax.
Command templates are the unit that compilers and generated SKILL.md loaders render into harness-readable instructions. Keep templates concrete and self-contained. Variable placeholders, if used, should follow a convention your harness understands.

Dependencies

Dependencies declare tools, files, environment variables, services, adapters, browsers, or packages needed by commands or routes. They belong in the top-level dependencies mapping and are referenced by commands, code blocks, recipes, and dependency provision elicitations.

Dependency Kinds

The check sub-field describes how to determine presence:
The permission sub-field describes whether use needs user approval:
The provision sub-field describes install or connection options that must be selected through elicitation before mutation:

Checking Dependencies

The reference CLI directly checks cli, file, and env dependencies. package, service, adapter, and browser dependencies are reported as requiring harness-level checks.

Artifacts

Artifacts name the files or data products that commands, code blocks, and recipes consume or produce. They make dataflow explicit without requiring a workflow engine.

Artifact Kinds

produced_by and consumed_by take executable refs only. Valid kind values are command, code, and recipe. Routes and rules can require checks, schedule recipes, or reference imports and resources, but they are not artifact producers or consumers.

Recipes

Recipes are structured procedures — especially useful for multi-step workflows where the order and conditions of import loading, command execution, and artifact production matter.
When ordered is true, the harness should execute steps in sequence. When false or absent, the harness may choose execution order.

Recipe Steps

Each step is a single-key object naming the step kind and its target id:
The reference CLI validates recipe references but does not execute recipes. Execution remains the harness’s responsibility.

Code Blocks

Code blocks preserve executable knowledge extracted from source material or written inline. They live in the top-level code mapping.
source is either inline YAML (source.inline: |) or a file reference (source.file: path/to/script.sh). Code safety uses a separate sub-object with boolean flags (mutates_input, writes_files, network) rather than the string safety class used by commands.
A fenced code block extracted from a prose skill is not automatically safe to run just because it is represented in the spec. Importers should preserve code as example kind first and only promote to runnable_script after explicit review.

Snippets

Snippets carry prose that should remain prose: questions, user-facing copy, completion prompts, or short explanations. They belong in the top-level snippets mapping and are referenced by states.
Keeping prose in snippets rather than in command templates or rule reasons means generated SKILL.md loaders can stay small without losing product voice. It also makes user-facing copy reviewable and testable independently of routing logic.

Closures

closures is an open mapping for post-task behavior. Common closure names describe actions like summarizing cost, writing a digest, asking to remember, or asking to share with a team.
v0 keeps this section open because closure names are often product-specific. Closures are referenced from Rule.after_success, which ties them to the rule that made them necessary:

Complete Command Example

The following shows a command with a safety class, dependency requirement, and parse hints:
The safety: read_only declaration tells the harness this command reads without mutating state. The requires block declares that skillspec_cli must be present and skill.spec.yml must exist before the command can run. parse provides extraction hints a harness can use to pull structured values from command output without needing to re-parse the raw text.