← Files AMDARCHIVED FILE

docs/skill-requirements.md

5.3 KB · Nov 12, 2026 · 18:37 UTC

↓ Download file

See the change to this file →

# Skill Requirements

What must be true for a skill to merge. Every rule here is checked by
`./.github/scripts/check.sh`, which is the same command CI runs on every pull
request.

New skills are accepted only as federated submissions, authored in an AMD
product repo and vendored into this catalog; see
[CONTRIBUTING.md](../CONTRIBUTING.md) for that process. The rules below are
validated against the vendored copy, so everything they ask for belongs in the
skill folder upstream. For advice on writing a *good* skill rather than a valid
one, see [best-practices.md](best-practices.md).

## Required files

Each skill is one folder in your repo, vendored to `skills/<skill-name>/` here:

```
<skill-name>/
  SKILL.md          # required: frontmatter + instructions
  skill-card.md     # required: governance card
  evals/evals.json  # required: routing and behavior dataset
```

## SKILL.md

The frontmatter must be a valid YAML block containing `name` and `description`.

| Field | Rule |
| --- | --- |
| `name` | lowercase-with-hyphens, ≤ 64 characters, no `anthropic` or `claude` substring, matches the directory name |
| `description` | non-empty, ≤ 1024 characters |
| body | ≤ 500 lines |

Catalog names are namespaced `<project>-<skill>` to stay unique. You do not
have to rename your upstream folder for that: set `as` in
`.github/federation.json` and
the importer rewrites the folder name and the `name` frontmatter together, so
they still match after vendoring.

## skill-card.md

A short, human-facing governance record at the skill root. It tells a reviewer
what the skill is, who owns it, and under what license it ships, without making
them read the source. `SKILL.md` is written for the agent; the card is written
for the people deciding whether to trust, install, or maintain the skill. It is
never loaded into agent context.

Three sections are required, each a `##` heading with non-empty body text:

| Section | Question it answers |
| --- | --- |
| Description | What does this skill do, in one sentence? |
| Owner | Who is accountable for maintaining it? |
| License | What license governs its use and redistribution? |

Copy this into your skill folder as `skill-card.md`:

```markdown
# Skill Card

## Description

<one sentence: what the skill does, for whom>

## Owner

<team or org accountable for maintenance, e.g. AMD>

## License

<SPDX identifier or link, e.g. MIT>
```

Keep the Description to one sentence stating the outcome, matching the
marketplace blurb. Internal mechanics belong in `SKILL.md`.

```
Good: Diagnose why ROCm, PyTorch, or llama.cpp isn't working on an AMD GPU
      and propose the next step.
Bad:  Runs a series of Python scripts that parse logs and apply regex rules.
```

The card stays at these three sections. Evaluation results, benchmark data,
risk statements, and signing identifiers are not part of the AMD card today;
sections can be added later without breaking the validation gate.

If your skill folder ships a card, it is vendored as-is. If it does not, the
importer synthesizes a minimal one from the source metadata so the skill still
clears the validation gate — but it will be generic, so write your own.

## evals/evals.json

Every skill needs a dataset: at least 3 evaluations with
`skill_should_trigger: true` and 2 with `false`. CI rejects a skill without
them.

[skillscope](https://github.com/amd/skillscope) also enforces that the file is
parseable and uses only known fields (a typo'd key is an error, not a silently
dropped expectation), that `skill_should_trigger` is present and a real boolean
on every evaluation, that case ids are unique across the whole repo, that a
`false` evaluation carries only an id and a prompt, and that any `workspace`
points at a directory that exists.

See [evals.md](evals.md) for what to put in the file and how it is graded.

## Publishing

Do not edit any marketplace manifest (`.claude-plugin/marketplace.json`,
`.cursor-plugin/marketplace.json`, `.agents/plugins/marketplace.json`) in your
PR, and do not run `publish.sh`. Which skills go into the published
`amd-skills` bundle is decided separately, after your skill merges.

## Before you open the PR

CI will reject the skill if any of these are false:

- [ ] `SKILL.md` has valid frontmatter; `name` is lowercase-with-hyphens, ≤ 64 chars, and matches the directory
- [ ] `description` is non-empty and ≤ 1024 characters
- [ ] `SKILL.md` body is ≤ 500 lines
- [ ] `skill-card.md` exists with non-empty Description, Owner, and License
- [ ] `evals/evals.json` has ≥ 3 `true` and ≥ 2 `false` evaluations, with unique ids
- [ ] No marketplace manifests are edited
- [ ] `./.github/scripts/check.sh` passes

A reviewer will push back if any of these are false:

- [ ] The description states the user's goal and includes likely trigger phrases
- [ ] At least one evaluation grades behavior, or the skill genuinely needs hardware CI cannot reach
- [ ] Prerequisites (ROCm version, GPU arch, container, env vars) are stated explicitly
- [ ] Scripts handle expected errors and document their constants and dependencies
- [ ] The skill was tested end-to-end on the target hardware against real prompts

```bash
./.github/scripts/check.sh                      # structural validation, no tokens
skillscope routing --routing-room all           # which skill fires
skillscope behavioral --skill <your-skill>      # what it does once it has fired
```

SHA-256: c1615fa3f02e26f3308cc89814f37519c4216ed657ee52ed503766263575adc4