---
audience: engineers
summary: Skill registry + injection layer for LLM turns; publish, bind, resolve, view
title: ScaiSkills
path: modules/scaiskills
status: published
---

# ScaiSkills

ScaiSkills is ScaiGrid's **skill registry and injection layer** — the module that lets platform operators, partners, and tenants publish reusable capability bundles (`.tar.gz` skill packages containing a `SKILL.md`, references, and manifest) that an LLM turn can consume via progressive disclosure.

A "skill" is a piece of authored knowledge — a style guide, a step-by-step procedure, a domain vocabulary — that:

- Lives in one canonical place instead of copy-pasted into every bot's persona.
- Is scoped: a skill applies where a **binding** says it does (workspace / channel / user / core) — OR where a platform-wide **global** marker says it does.
- Reaches the model via three MCP tools the LLM can call during a turn: `skills.list()`, `skills.search(query)`, `skills.view(slug, path?)`.

## When to use

- You want the same knowledge to reach every agent in a tenant without editing each bot's system prompt.
- Multiple teams need to share a capability (e.g. a document-authoring skill, a compliance workflow, a domain glossary).
- You want the knowledge to be discoverable during a turn instead of stuffed into a system prompt that eats context.

If a single agent needs a single style guide, you may not need ScaiSkills — put it in the bot's tone config or a linked ScaiMatrix collection.

## How the pieces fit

- **Publish** a skill: upload a `.tar.gz` bundle with a `SKILL.md` and manifest. Each publish creates an immutable version (semver). Old versions stay reachable until yanked.
- **Bind** a skill to a scope: `POST /v1/modules/scaiskills/bindings` with `skill_id`, `version`, `scope_type`, `scope_id`. The skill is now active for that scope.
- **Resolve** at turn time: ScaiWave (and any other consumer) calls `POST /v1/modules/scaiskills/resolve` with the caller's scope tuple. Response is a lightweight list of `{slug, version, description, triggers, source}`. Consumers inject these into the turn's preamble so the model knows which skills are available.
- **View** on demand: when the model wants the full skill body, it calls `skills.view(slug)` — that returns `SKILL.md`, or `SKILL.md`'s referenced files with `?path=references/...`.

## Platform globals — v1 / v2 / v3 (shipped 2026-07-03)

A super_admin can mark a skill **platform-global** so it appears in every resolve response without a per-scope binding. Partner admins can do the same at partner scope. Tenant admins can **opt out** to hide a specific global for their workspace.

- v1: platform-global via `PUT /v1/modules/scaiskills/skills/{slug}/global`
- v2: partner-global via the same route with `scope_type: "partner"`
- v3: per-scope opt-out via `PUT /v1/modules/scaiskills/skills/{slug}/global/opt-out`

Full walkthrough: **[Global skills](./scaiskills/global-skills)**.

## Precedence

When multiple sources for the same slug apply, the highest-precedence source wins:

    core > user > channel > workspace > global

A tenant binding always overrides a global — that's how a tenant pins their own version of a universal skill.

## Related

- **ScaiBot** — consumes ScaiSkills via the bot's tool executor. When a bot has skills bound to its owning workspace, they reach the LLM automatically.
- **ScaiCore** — the same resolve/view calls work with a core-scope binding for headless runtimes.
- **ScaiWave** — the reference consumer. Its skills plugin calls `resolve` before every turn and injects the returned slug list into the preamble.
