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

# codes.skill@1 · OpenVibe.Services

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

# CodesSkill `codes.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).

- Version: 1.0.0
- Owner: codes
- Visibility: public
- Status: active
- Compatibility: backward
- Schema: [`https://openvibe.network/contracts/codes/skill.v1.json`](/docs/contracts/codes.skill.json)

codes.skill@1: one skill, rule, MCP server, command or hook in the OpenVibe.Codes hub (the Compute plan §5, E6). KIND says what it is: a skill is a SKILL.md folder the agent tools load, a rule is text for the tools' AGENTS.md/CLAUDE.md files, an mcp record is one MCP server definition, and command/hook are a slash command and a hook. SLUG is the folder name (lowercase letters, digits and hyphens) and is stable within one owner. VERSION is the newest record in codes.skill-version@1; BODY is that version's content. AUDIENCE is the four sharing audiences of openvibe-sdk/share: private (the owner only), people (the owner and the members listed in codes\_skill\_members), link (anyone with the link, not in the gallery) and public (the gallery, search and agents). A private, people or link record is never in the gallery. OFFICIAL marks OpenVibe's own skills. TOOLS names the harnesses the skill is written for; an empty list means every tool the Link knows. The body is untrusted text: the page renders it through the markup gate (escape first, then a small Markdown subset), never as HTML.

## Fields

| Field | Type | Required | Description | Constraints |
| --- | --- | --- | --- | --- |
| `id` | string | yes | The hub id (skl\_ + ULID). | - `pattern ^skl_[0-9A-HJKMNP-TV-Z]{26}$` |
| `owner_subject` | string | yes | The person who owns the record. | - `pattern ^usr_[0-9A-HJKMNP-TV-Z]{26}$` |
| `kind` | enum | yes |  | - `one of "skill", "rule", "mcp", "command", "hook"` |
| `slug` | string | yes | The stable folder name (SKILL.md lives in a folder with this name). | - `pattern ^[a-z0-9][a-z0-9-]{0,63}$` |
| `title` | string | yes |  | - `minLength 1`<br>- `maxLength 120` |
| `summary` | string | yes |  | - `maxLength 500` |
| `audience` | enum | yes | The sharing audience, the same four openvibe-sdk/share uses. | - `one of "public", "link", "people", "private"` |
| `official` | boolean | yes | True for OpenVibe's own records; the gallery shows them beside community ones. |  |
| `tools` | array of enum | yes |  | - `maxItems 8`<br>- `unique items`<br>- `items: one of "claude-code", "codex", "opencode", "command-code", "minimax-code", "aider", "agents"` |
| `version` | integer | yes | The newest coded\_skill\_versions row for this record. | - `minimum 1` |
| `body` | string | yes | The skill's SKILL.md body (or the rule/command/hook/MCP text), untrusted Markdown. | - `minLength 1`<br>- `maxLength 131072` |
| `created_at` | string | yes |  | - `format date-time` |
| `updated_at` | string | yes |  | - `format date-time` |

## Examples

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

 Valid: mcp

~~~~
{
  "id": "skl_01M4XEV0JT93CAYTXVD6V0QW3B",
  "owner_subject": "usr_01M4XEV0JT93CAYTXVD6V0QW1F",
  "kind": "mcp",
  "slug": "openvibe-know",
  "title": "OpenVibe Know",
  "summary": "The shared knowledge lookup as an MCP server.",
  "audience": "people",
  "official": true,
  "tools": [
    "claude-code",
    "codex"
  ],
  "version": 2,
  "body": "{\"command\":\"ov-know-mcp\",\"args\":[]}",
  "created_at": "2026-11-07T09:00:00.000Z",
  "updated_at": "2026-11-07T11:00:00.000Z"
}
~~~~

Valid: rule

~~~~
{
  "id": "skl_01M4XEV0JT93CAYTXVD6V0QW2A",
  "owner_subject": "usr_01M4XEV0JT93CAYTXVD6V0QW1F",
  "kind": "rule",
  "slug": "no-force-push",
  "title": "Never force-push",
  "summary": "A branch is append-only once somebody may have read it.",
  "audience": "private",
  "official": false,
  "tools": [],
  "version": 1,
  "body": "Never force-push a shared branch; add a commit instead.",
  "created_at": "2026-11-07T09:00:00.000Z",
  "updated_at": "2026-11-07T09:00:00.000Z"
}
~~~~

Valid: skill

~~~~
{
  "id": "skl_01M4XEV0JT93CAYTXVD6V0QW1E",
  "owner_subject": "usr_01M4XEV0JT93CAYTXVD6V0QW1F",
  "kind": "skill",
  "slug": "ship-a-change",
  "title": "Ship a change",
  "summary": "Open a pull request, wait for CI, and merge only when it is green.",
  "audience": "public",
  "official": false,
  "tools": [
    "claude-code",
    "codex",
    "opencode"
  ],
  "version": 3,
  "body": "---\nname: ship-a-change\ndescription: Open a PR, wait for CI, and merge only when it is green.\n---\n\n# Ship a change\n\n1. Read the repository's own instructions.\n2. Run the narrowest test that proves the change.\n3. Open the pull request with what changed and how it was checked.\n",
  "created_at": "2026-11-07T09:00:00.000Z",
  "updated_at": "2026-11-07T10:30:00.000Z"
}
~~~~

Rejected: bad-audience

~~~~
{
  "id": "skl_01M4XEV0JT93CAYTXVD6V0QW1E",
  "owner_subject": "usr_01M4XEV0JT93CAYTXVD6V0QW1F",
  "kind": "skill",
  "slug": "ship-a-change",
  "title": "Ship a change",
  "summary": "",
  "audience": "everyone",
  "official": false,
  "tools": [],
  "version": 1,
  "body": "text",
  "created_at": "2026-11-07T09:00:00.000Z",
  "updated_at": "2026-11-07T09:00:00.000Z"
}
~~~~

Rejected: bad-id

~~~~
{
  "id": "skl_bad",
  "owner_subject": "usr_01M4XEV0JT93CAYTXVD6V0QW1F",
  "kind": "skill",
  "slug": "ship-a-change",
  "title": "Ship a change",
  "summary": "",
  "audience": "public",
  "official": false,
  "tools": [],
  "version": 1,
  "body": "text",
  "created_at": "2026-11-07T09:00:00.000Z",
  "updated_at": "2026-11-07T09:00:00.000Z"
}
~~~~

Rejected: bad-kind

~~~~
{
  "id": "skl_01M4XEV0JT93CAYTXVD6V0QW1E",
  "owner_subject": "usr_01M4XEV0JT93CAYTXVD6V0QW1F",
  "kind": "plugin",
  "slug": "ship-a-change",
  "title": "Ship a change",
  "summary": "",
  "audience": "public",
  "official": false,
  "tools": [],
  "version": 1,
  "body": "text",
  "created_at": "2026-11-07T09:00:00.000Z",
  "updated_at": "2026-11-07T09:00:00.000Z"
}
~~~~

Rejected: bad-tools

~~~~
{
  "id": "skl_01M4XEV0JT93CAYTXVD6V0QW1E",
  "owner_subject": "usr_01M4XEV0JT93CAYTXVD6V0QW1F",
  "kind": "skill",
  "slug": "Ship a change",
  "title": "Ship a change",
  "summary": "",
  "audience": "public",
  "official": false,
  "tools": [
    "not-a-tool"
  ],
  "version": 1,
  "body": "text",
  "created_at": "2026-11-07T09:00:00.000Z",
  "updated_at": "2026-11-07T09:00:00.000Z"
}
~~~~

Rejected: missing-body

~~~~
{
  "id": "skl_01M4XEV0JT93CAYTXVD6V0QW1E",
  "owner_subject": "usr_01M4XEV0JT93CAYTXVD6V0QW1F",
  "kind": "skill",
  "slug": "ship-a-change",
  "title": "Ship a change",
  "summary": "",
  "audience": "public",
  "official": false,
  "tools": [],
  "version": 1,
  "created_at": "2026-11-07T09:00:00.000Z",
  "updated_at": "2026-11-07T09:00:00.000Z"
}
~~~~

## Validate

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