---
title: "actor.skill@1 · OpenVibe.Services"
canonical: "https://openvibe.services/docs/contracts/actor.skill@1"
updated: null
---

# actor.skill@1 · OpenVibe.Services

HTML: [actor.skill@1 · OpenVibe.Services](https://openvibe.services/docs/contracts/actor.skill@1)

# ActorSkill `actor.skill@1`

Generated at 2026-11-13 06:25:48 UTC from [`openvibe-contracts v0.419.0`](https://github.com/OpenVibers/OpenVibe.Contracts/tree/v0.419.0) and [`openvibe-sdk v0.161.0`](https://github.com/OpenVibers/OpenVibe.SDK/tree/v0.161.0).

An older major, still in the catalog. The current one is [`actor.skill@2`](/docs/contracts/actor.skill).

- Version: 1.1.0
- Owner: actor
- Visibility: public
- Status: active
- Compatibility: backward
- Decision: [ADR-058](/docs/adr/ADR-058)
- Schema: [`https://openvibe.network/contracts/actor/skill.v1.json`](/docs/contracts/actor.skill@1.json)

actor.skill@1: a skill, the document an agent loads to do one kind of job well (ADR-058). It follows the open Markdown-skill shape (a name, a one-line description, Markdown instructions) with what OpenVibe adds: a slug, a version, up to ten TEXT resources, and REQUIRES, what the skill may ask an agent to do. A skill GRANTS NOTHING: requires only declares; the agent's level and approvals decide every step (actor approvals, HO1), and a step of a kind the skill did not declare is a scan finding (actor.skill-listing@1). A v1 skill RUNS AS A PROMPT and nothing else: no code, no binary, no install recipe (a skill that runs code waits for a sandbox and a new major). DESCRIPTION is the only part an agent reads before it loads the skill (progressive disclosure), so it says when to use it. The INTEGRITY block is a sha256 over the canonical JSON of the document: it shows the file was not edited after it was written and says nothing about who wrote it, so the AUTHOR is a claim; the registry's listing is the only place a publisher is vouched for. The canonical JSON is the document's own fields, in this order: skill, slug, name, description, version, instructions, resources, requires, runs, license, author; an optional field that is absent or empty is left out; resources are \[{ path, media\_type, text }\] in the document's order; requires is { kinds, apps, hosts } with empty lists left out; author is { subject } or { subject, name }; the value is the compact JSON of that object (no spaces). CREATED\_AT is not hashed.

## Fields

| Field | Type | Required | Description | Constraints |
| --- | --- | --- | --- | --- |
| `skill` | const | yes | The document marker. | - `= "actor.skill@1"` |
| `slug` | string | yes | Its name in the registry: lowercase letters, digits and hyphens. | - `pattern ^[a-z0-9](?:[a-z0-9-]{0,62}[a-z0-9])?$` |
| `name` | string | yes | What a person reads on its card. | - `minLength 1`<br>- `maxLength 80` |
| `description` | string | yes | When to use it, in one line: the only part an agent reads before it loads the skill. | - `minLength 1`<br>- `maxLength 280` |
| `version` | string | yes | Its semantic version. | - `pattern ^(0\|[1-9][0-9]{0,5})\.(0\|[1-9][0-9]{0,5})\.(0\|[1-9][0-9]{0,5})$` |
| `instructions` | string | yes | What to do, in Markdown. The agent reads it as guidance; it never grants a permission. | - `minLength 1`<br>- `maxLength 20000` |
| `resources` | array of object |  | Text the instructions refer to (a checklist, a template, a table). Never code to run. | - `maxItems 10`<br>- `items: no other fields` |
| `resources[].path` | string | yes | A relative name, no "..", ending in .md, .txt, .json or .csv. | - `pattern ^[a-z0-9][a-z0-9_-]{0,59}(?:/[a-z0-9][a-z0-9_-]{0,59}){0,3}\.(md\|txt\|json\|csv)$` |
| `resources[].media_type` | enum | yes |  | - `one of "text/markdown", "text/plain", "application/json", "text/csv"` |
| `resources[].text` | string | yes |  | - `maxLength 20000` |
| `requires` | object |  | What the skill may ask an agent to do. It grants nothing: each step still goes through the agent's level and approvals. | - `no other fields` |
| `requires.kinds` | array of enum |  | The kinds of act (actor approvals, HO1) its steps may be. | - `maxItems 18`<br>- `unique items`<br>- `items: one of "codes.task", "actor.action", "computer.run", "computer.write", "computer.input", "computer.browser", "computer.desk", "robot.move", "space", "publish", "post", "send", "install", "routine", "money", "device.camera", "device.location", "device.notify"` |
| `requires.apps` | array of string |  | Connected apps it uses (connect slugs). The person connects each one themselves. | - `maxItems 20`<br>- `unique items`<br>- `items: pattern ^[a-z][a-z0-9._-]{0,63}$` |
| `requires.hosts` | array of string |  | Web hosts it reads from or writes to. | - `maxItems 20`<br>- `unique items`<br>- `items: pattern ^(?=.{1,253}$)([a-z0-9](?:[a-z0-9-]{0,61}[a-z0-9])?\.)+[a-z]{2,63}$` |
| `runs` | const | yes | How it runs. v1 skills are instructions and text only. | - `= "prompt"` |
| `license` | string |  | An SPDX licence id, such as MIT or CC-BY-4.0. | - `minLength 1`<br>- `maxLength 64` |
| `author` | object |  | Who the document says wrote it: a claim, never checked here. | - `no other fields` |
| `author.subject` | string | yes |  | - `pattern ^usr_[0-9A-HJKMNP-TV-Z]{26}$` |
| `author.name` | string |  |  | - `minLength 1`<br>- `maxLength 80` |
| `created_at` | string |  | When the document was written. Not hashed. | - `format date-time` |
| `integrity` | object | yes | A sha256 over the canonical JSON: the file was not edited after it was written. Not a signature. | - `no other fields` |
| `integrity.alg` | const | yes |  | - `= "sha256"` |
| `integrity.hash` | string | yes |  | - `pattern ^[0-9a-f]{64}$` |

## Examples

From the contract's own test fixtures: valid ones validate, rejected ones must fail.

The fixtures that ship with the package are the current major's.

## Validate

~~~~
const contracts = require('openvibe-contracts');
contracts.validate('actor.skill@1', value);   // { valid, errors: [{ path, message }] }
~~~~
